# Importing all libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
# Création du DataFrame fictif
data = {
'idclient': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2],
'année': [2020, 2020, 2020, 2021, 2021, 2021, 2020, 2020, 2020, 2021, 2021, 2021],
'mois': [10, 11, 12, 1, 2, 3, 10, 11, 12, 1, 2, 3],
'code_operation': [515, 520, 525, 530, 515, 155, 515, 520, 525, 530, 515, 540]
}
df = pd.DataFrame(data)
# Triez le DataFrame par client, année et mois
df = df.sort_values(['idclient', 'année', 'mois'])
# Ajoutez une colonne pour indiquer si le code d'opération 515 est présent pour chaque trimestre
df['code_515_present'] = 0 #N
# Groupement par client
#grouped = df.groupby('idclient')
# Utilisez une fenêtre glissante avec rolling pour vérifier chaque trimestre
df['code_515_present'] = df.groupby('idclient')['code_operation'].rolling(window=3, min_periods=1).apply(lambda x: 1 if any(x == 515) else 0)\
.reset_index(0, drop=True)
# Affichage du DataFrame résultant
print(df)
idclient année mois code_operation code_515_present 0 1 2020 10 515 1.0 6 1 2020 10 515 1.0 1 1 2020 11 520 1.0 7 1 2020 11 520 1.0 2 1 2020 12 525 0.0 8 1 2020 12 525 0.0 3 1 2021 1 530 0.0 9 1 2021 1 530 0.0 4 1 2021 2 515 1.0 5 1 2021 3 155 1.0 10 2 2021 2 515 1.0 11 2 2021 3 540 1.0
df.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 12 entries, 0 to 11 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 idclient 12 non-null int64 1 année 12 non-null int64 2 mois 12 non-null int64 3 code_operation 12 non-null int64 4 montant 12 non-null int64 5 code_515_present 12 non-null object dtypes: int64(5), object(1) memory usage: 672.0+ bytes
path = 'archive/UCI_Credit_Card.csv'
df = pd.read_csv(path)
df.head()
| ID | LIMIT_BAL | SEX | EDUCATION | MARRIAGE | AGE | PAY_0 | PAY_2 | PAY_3 | PAY_4 | ... | BILL_AMT4 | BILL_AMT5 | BILL_AMT6 | PAY_AMT1 | PAY_AMT2 | PAY_AMT3 | PAY_AMT4 | PAY_AMT5 | PAY_AMT6 | default.payment.next.month | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 20000.0 | 2 | 2 | 1 | 24 | 2 | 2 | -1 | -1 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 689.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 |
| 1 | 2 | 120000.0 | 2 | 2 | 2 | 26 | -1 | 2 | 0 | 0 | ... | 3272.0 | 3455.0 | 3261.0 | 0.0 | 1000.0 | 1000.0 | 1000.0 | 0.0 | 2000.0 | 1 |
| 2 | 3 | 90000.0 | 2 | 2 | 2 | 34 | 0 | 0 | 0 | 0 | ... | 14331.0 | 14948.0 | 15549.0 | 1518.0 | 1500.0 | 1000.0 | 1000.0 | 1000.0 | 5000.0 | 0 |
| 3 | 4 | 50000.0 | 2 | 2 | 1 | 37 | 0 | 0 | 0 | 0 | ... | 28314.0 | 28959.0 | 29547.0 | 2000.0 | 2019.0 | 1200.0 | 1100.0 | 1069.0 | 1000.0 | 0 |
| 4 | 5 | 50000.0 | 1 | 2 | 1 | 57 | -1 | 0 | -1 | 0 | ... | 20940.0 | 19146.0 | 19131.0 | 2000.0 | 36681.0 | 10000.0 | 9000.0 | 689.0 | 679.0 | 0 |
5 rows × 25 columns
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 30000 entries, 0 to 29999 Data columns (total 25 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 30000 non-null int64 1 LIMIT_BAL 30000 non-null float64 2 SEX 30000 non-null int64 3 EDUCATION 30000 non-null int64 4 MARRIAGE 30000 non-null int64 5 AGE 30000 non-null int64 6 PAY_0 30000 non-null int64 7 PAY_2 30000 non-null int64 8 PAY_3 30000 non-null int64 9 PAY_4 30000 non-null int64 10 PAY_5 30000 non-null int64 11 PAY_6 30000 non-null int64 12 BILL_AMT1 30000 non-null float64 13 BILL_AMT2 30000 non-null float64 14 BILL_AMT3 30000 non-null float64 15 BILL_AMT4 30000 non-null float64 16 BILL_AMT5 30000 non-null float64 17 BILL_AMT6 30000 non-null float64 18 PAY_AMT1 30000 non-null float64 19 PAY_AMT2 30000 non-null float64 20 PAY_AMT3 30000 non-null float64 21 PAY_AMT4 30000 non-null float64 22 PAY_AMT5 30000 non-null float64 23 PAY_AMT6 30000 non-null float64 24 default.payment.next.month 30000 non-null int64 dtypes: float64(13), int64(12) memory usage: 5.7 MB
df.isnull().sum()
ID 0 LIMIT_BAL 0 SEX 0 EDUCATION 0 MARRIAGE 0 AGE 0 PAY_0 0 PAY_2 0 PAY_3 0 PAY_4 0 PAY_5 0 PAY_6 0 BILL_AMT1 0 BILL_AMT2 0 BILL_AMT3 0 BILL_AMT4 0 BILL_AMT5 0 BILL_AMT6 0 PAY_AMT1 0 PAY_AMT2 0 PAY_AMT3 0 PAY_AMT4 0 PAY_AMT5 0 PAY_AMT6 0 default.payment.next.month 0 dtype: int64
df.describe()
| ID | LIMIT_BAL | SEX | EDUCATION | MARRIAGE | AGE | PAY_0 | PAY_2 | PAY_3 | PAY_4 | ... | BILL_AMT4 | BILL_AMT5 | BILL_AMT6 | PAY_AMT1 | PAY_AMT2 | PAY_AMT3 | PAY_AMT4 | PAY_AMT5 | PAY_AMT6 | default.payment.next.month | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | ... | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 | 3.000000e+04 | 30000.00000 | 30000.000000 | 30000.000000 | 30000.000000 | 30000.000000 |
| mean | 15000.500000 | 167484.322667 | 1.603733 | 1.853133 | 1.551867 | 35.485500 | -0.016700 | -0.133767 | -0.166200 | -0.220667 | ... | 43262.948967 | 40311.400967 | 38871.760400 | 5663.580500 | 5.921163e+03 | 5225.68150 | 4826.076867 | 4799.387633 | 5215.502567 | 0.221200 |
| std | 8660.398374 | 129747.661567 | 0.489129 | 0.790349 | 0.521970 | 9.217904 | 1.123802 | 1.197186 | 1.196868 | 1.169139 | ... | 64332.856134 | 60797.155770 | 59554.107537 | 16563.280354 | 2.304087e+04 | 17606.96147 | 15666.159744 | 15278.305679 | 17777.465775 | 0.415062 |
| min | 1.000000 | 10000.000000 | 1.000000 | 0.000000 | 0.000000 | 21.000000 | -2.000000 | -2.000000 | -2.000000 | -2.000000 | ... | -170000.000000 | -81334.000000 | -339603.000000 | 0.000000 | 0.000000e+00 | 0.00000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 25% | 7500.750000 | 50000.000000 | 1.000000 | 1.000000 | 1.000000 | 28.000000 | -1.000000 | -1.000000 | -1.000000 | -1.000000 | ... | 2326.750000 | 1763.000000 | 1256.000000 | 1000.000000 | 8.330000e+02 | 390.00000 | 296.000000 | 252.500000 | 117.750000 | 0.000000 |
| 50% | 15000.500000 | 140000.000000 | 2.000000 | 2.000000 | 2.000000 | 34.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | ... | 19052.000000 | 18104.500000 | 17071.000000 | 2100.000000 | 2.009000e+03 | 1800.00000 | 1500.000000 | 1500.000000 | 1500.000000 | 0.000000 |
| 75% | 22500.250000 | 240000.000000 | 2.000000 | 2.000000 | 2.000000 | 41.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | ... | 54506.000000 | 50190.500000 | 49198.250000 | 5006.000000 | 5.000000e+03 | 4505.00000 | 4013.250000 | 4031.500000 | 4000.000000 | 0.000000 |
| max | 30000.000000 | 1000000.000000 | 2.000000 | 6.000000 | 3.000000 | 79.000000 | 8.000000 | 8.000000 | 8.000000 | 8.000000 | ... | 891586.000000 | 927171.000000 | 961664.000000 | 873552.000000 | 1.684259e+06 | 896040.00000 | 621000.000000 | 426529.000000 | 528666.000000 | 1.000000 |
8 rows × 25 columns
Dependent Variable:
#renaming for better convinience
df['IsDefaulter'] =df ['default.payment.next.month']
df.drop('default.payment.next.month',axis = 1)
# df.rename({'default.payment.next.month' : 'IsDefaulter'}, inplace=True)
| ID | LIMIT_BAL | SEX | EDUCATION | MARRIAGE | AGE | PAY_0 | PAY_2 | PAY_3 | PAY_4 | ... | BILL_AMT4 | BILL_AMT5 | BILL_AMT6 | PAY_AMT1 | PAY_AMT2 | PAY_AMT3 | PAY_AMT4 | PAY_AMT5 | PAY_AMT6 | IsDefaulter | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 20000.0 | 2 | 2 | 1 | 24 | 2 | 2 | -1 | -1 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 689.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 |
| 1 | 2 | 120000.0 | 2 | 2 | 2 | 26 | -1 | 2 | 0 | 0 | ... | 3272.0 | 3455.0 | 3261.0 | 0.0 | 1000.0 | 1000.0 | 1000.0 | 0.0 | 2000.0 | 1 |
| 2 | 3 | 90000.0 | 2 | 2 | 2 | 34 | 0 | 0 | 0 | 0 | ... | 14331.0 | 14948.0 | 15549.0 | 1518.0 | 1500.0 | 1000.0 | 1000.0 | 1000.0 | 5000.0 | 0 |
| 3 | 4 | 50000.0 | 2 | 2 | 1 | 37 | 0 | 0 | 0 | 0 | ... | 28314.0 | 28959.0 | 29547.0 | 2000.0 | 2019.0 | 1200.0 | 1100.0 | 1069.0 | 1000.0 | 0 |
| 4 | 5 | 50000.0 | 1 | 2 | 1 | 57 | -1 | 0 | -1 | 0 | ... | 20940.0 | 19146.0 | 19131.0 | 2000.0 | 36681.0 | 10000.0 | 9000.0 | 689.0 | 679.0 | 0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 29995 | 29996 | 220000.0 | 1 | 3 | 1 | 39 | 0 | 0 | 0 | 0 | ... | 88004.0 | 31237.0 | 15980.0 | 8500.0 | 20000.0 | 5003.0 | 3047.0 | 5000.0 | 1000.0 | 0 |
| 29996 | 29997 | 150000.0 | 1 | 3 | 2 | 43 | -1 | -1 | -1 | -1 | ... | 8979.0 | 5190.0 | 0.0 | 1837.0 | 3526.0 | 8998.0 | 129.0 | 0.0 | 0.0 | 0 |
| 29997 | 29998 | 30000.0 | 1 | 2 | 2 | 37 | 4 | 3 | 2 | -1 | ... | 20878.0 | 20582.0 | 19357.0 | 0.0 | 0.0 | 22000.0 | 4200.0 | 2000.0 | 3100.0 | 1 |
| 29998 | 29999 | 80000.0 | 1 | 3 | 1 | 41 | 1 | -1 | 0 | 0 | ... | 52774.0 | 11855.0 | 48944.0 | 85900.0 | 3409.0 | 1178.0 | 1926.0 | 52964.0 | 1804.0 | 1 |
| 29999 | 30000 | 50000.0 | 1 | 2 | 1 | 46 | 0 | 0 | 0 | 0 | ... | 36535.0 | 32428.0 | 15313.0 | 2078.0 | 1800.0 | 1430.0 | 1000.0 | 1000.0 | 1000.0 | 1 |
30000 rows × 25 columns
plt.figure(figsize=(10,5))
sns.countplot(x = 'IsDefaulter', data = df)
<AxesSubplot:xlabel='IsDefaulter', ylabel='count'>
df['IsDefaulter'].value_counts()
0 23364 1 6636 Name: IsDefaulter, dtype: int64
df['SEX'].value_counts()
2 18112 1 11888 Name: SEX, dtype: int64
df['EDUCATION'].value_counts()
2 14030 1 10585 3 4917 5 280 4 123 6 51 0 14 Name: EDUCATION, dtype: int64
fil = (df['EDUCATION'] == 5) | (df['EDUCATION'] == 6) | (df['EDUCATION'] == 0)
df.loc[fil, 'EDUCATION'] = 4
df['EDUCATION'].value_counts()
2 14030 1 10585 3 4917 5 280 4 123 6 51 0 14 Name: EDUCATION, dtype: int64
fil = df['MARRIAGE'] == 0
df.loc[fil, 'MARRIAGE'] = 3
df['MARRIAGE'].value_counts()
2 15964 1 13659 3 323 0 54 Name: MARRIAGE, dtype: int64
categorical_features = ['SEX', 'EDUCATION', 'MARRIAGE']
df_cat = df[categorical_features]
df_cat['Defaulter'] = df['IsDefaulter']
df_cat.replace({'SEX': {1 : 'MALE', 2 : 'FEMALE'},
'EDUCATION' : {1 : 'graduate school', 2 : 'university', 3 : 'high school', 4 : 'others'},
'MARRIAGE' : {1 : 'married', 2 : 'single', 3 : 'others'}}, inplace = True)
for col in categorical_features:
plt.figure(figsize=(10,5))
fig, axes = plt.subplots(ncols=2,figsize=(13,8))
df[col].value_counts().plot(kind="pie",ax = axes[0],subplots=True)
sns.countplot(x = col, hue = 'Defaulter', data = df_cat)
<Figure size 720x360 with 0 Axes>
<Figure size 720x360 with 0 Axes>
<Figure size 720x360 with 0 Axes>
sns.barplot(x='IsDefaulter', y='LIMIT_BAL', data=df)
<AxesSubplot:xlabel='IsDefaulter', ylabel='LIMIT_BAL'>
Q1 (premier quartile) : Le premier quartile divise les données en deux parties égales, où 25% des valeurs se situent en dessous de Q1. Cela signifie que 25% des données sont inférieures à Q1.
Q2 (deuxième quartile) : Q2 est simplement une autre appellation pour la médiane. Il divise les données en deux parties égales, où 50% des valeurs se situent en dessous de Q2 et 50% des valeurs se situent au-dessus de Q2.
Q3 (troisième quartile) : Le troisième quartile divise les données en deux parties égales, où 75% des valeurs se situent en dessous de Q3. Cela signifie que 25% des données sont supérieures à Q3
from IPython.display import Image
Image(filename='img.jpg')
plt.figure(figsize=(10,10))
ax = sns.boxplot(x="IsDefaulter", y="LIMIT_BAL", data=df)
#renaming columns
df.rename(columns={'PAY_0':'PAY_SEPT','PAY_2':'PAY_AUG','PAY_3':'PAY_JUL','PAY_4':'PAY_JUN','PAY_5':'PAY_MAY','PAY_6':'PAY_APR'},inplace=True)
df.rename(columns={'BILL_AMT1':'BILL_AMT_SEPT','BILL_AMT2':'BILL_AMT_AUG','BILL_AMT3':'BILL_AMT_JUL','BILL_AMT4':'BILL_AMT_JUN','BILL_AMT5':'BILL_AMT_MAY','BILL_AMT6':'BILL_AMT_APR'}, inplace = True)
df.rename(columns={'PAY_AMT1':'PAY_AMT_SEPT','PAY_AMT2':'PAY_AMT_AUG','PAY_AMT3':'PAY_AMT_JUL','PAY_AMT4':'PAY_AMT_JUN','PAY_AMT5':'PAY_AMT_MAY','PAY_AMT6':'PAY_AMT_APR'},inplace=True)
df.head()
| ID | LIMIT_BAL | SEX | EDUCATION | MARRIAGE | AGE | PAY_SEPT | PAY_AUG | PAY_JUL | PAY_JUN | ... | BILL_AMT_MAY | BILL_AMT_APR | PAY_AMT_SEPT | PAY_AMT_AUG | PAY_AMT_JUL | PAY_AMT_JUN | PAY_AMT_MAY | PAY_AMT_APR | default.payment.next.month | IsDefaulter | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 20000.0 | 2 | 2 | 1 | 24 | 2 | 2 | -1 | -1 | ... | 0.0 | 0.0 | 0.0 | 689.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1 | 1 |
| 1 | 2 | 120000.0 | 2 | 2 | 2 | 26 | -1 | 2 | 0 | 0 | ... | 3455.0 | 3261.0 | 0.0 | 1000.0 | 1000.0 | 1000.0 | 0.0 | 2000.0 | 1 | 1 |
| 2 | 3 | 90000.0 | 2 | 2 | 2 | 34 | 0 | 0 | 0 | 0 | ... | 14948.0 | 15549.0 | 1518.0 | 1500.0 | 1000.0 | 1000.0 | 1000.0 | 5000.0 | 0 | 0 |
| 3 | 4 | 50000.0 | 2 | 2 | 1 | 37 | 0 | 0 | 0 | 0 | ... | 28959.0 | 29547.0 | 2000.0 | 2019.0 | 1200.0 | 1100.0 | 1069.0 | 1000.0 | 0 | 0 |
| 4 | 5 | 50000.0 | 1 | 2 | 1 | 57 | -1 | 0 | -1 | 0 | ... | 19146.0 | 19131.0 | 2000.0 | 36681.0 | 10000.0 | 9000.0 | 689.0 | 679.0 | 0 | 0 |
5 rows × 26 columns
df['AGE'].value_counts()
df['AGE']=df['AGE'].astype('int')
fig, axes = plt.subplots(ncols=2,figsize=(20,10))
Day_df=df['AGE'].value_counts().reset_index()
df['AGE'].value_counts().plot(kind="pie",ax = axes[0],subplots=True)
sns.barplot(x='index',y='AGE',data=Day_df,ax = axes[1],orient='v')
<AxesSubplot:xlabel='index', ylabel='AGE'>
df.groupby('IsDefaulter')['AGE'].mean()
IsDefaulter 0 35.417266 1 35.725738 Name: AGE, dtype: float64
df = df.astype('int')
plt.figure(figsize=(10,10))
ax = sns.boxplot(x="IsDefaulter", y="AGE", data=df)
bill_amnt_df = df[['BILL_AMT_SEPT', 'BILL_AMT_AUG', 'BILL_AMT_JUL', 'BILL_AMT_JUN', 'BILL_AMT_MAY', 'BILL_AMT_APR']]
sns.pairplot(data = bill_amnt_df)
<seaborn.axisgrid.PairGrid at 0x10d05e75c40>
pay_col = ['PAY_SEPT', 'PAY_AUG', 'PAY_JUL', 'PAY_JUN', 'PAY_MAY', 'PAY_APR']
for col in pay_col:
plt.figure(figsize=(10,5))
sns.countplot(x = col, hue = 'IsDefaulter', data = df)
pay_amnt_df = df[['PAY_AMT_SEPT', 'PAY_AMT_AUG', 'PAY_AMT_JUL', 'PAY_AMT_JUN', 'PAY_AMT_MAY', 'PAY_AMT_APR', 'IsDefaulter']]
sns.pairplot(data = pay_amnt_df, hue='IsDefaulter')
<seaborn.axisgrid.PairGrid at 0x10d0d4677f0>
from imblearn.over_sampling import SMOTE
smote = SMOTE()
# fit predictor and target variable
x_smote, y_smote = smote.fit_resample(df.iloc[:,0:-1], df['IsDefaulter'])
print('Original dataset shape', len(df))
print('Resampled dataset shape', len(y_smote))
Original dataset shape 30000 Resampled dataset shape 46728
y_smote
0 1
1 1
2 0
3 0
4 0
..
46723 1
46724 1
46725 1
46726 1
46727 1
Name: IsDefaulter, Length: 46728, dtype: int32
columns = list(df.columns)
columns
['ID', 'LIMIT_BAL', 'SEX', 'EDUCATION', 'MARRIAGE', 'AGE', 'PAY_SEPT', 'PAY_AUG', 'PAY_JUL', 'PAY_JUN', 'PAY_MAY', 'PAY_APR', 'BILL_AMT_SEPT', 'BILL_AMT_AUG', 'BILL_AMT_JUL', 'BILL_AMT_JUN', 'BILL_AMT_MAY', 'BILL_AMT_APR', 'PAY_AMT_SEPT', 'PAY_AMT_AUG', 'PAY_AMT_JUL', 'PAY_AMT_JUN', 'PAY_AMT_MAY', 'PAY_AMT_APR', 'default.payment.next.month', 'IsDefaulter']
columns.pop()
'IsDefaulter'
balance_df = pd.DataFrame(x_smote, columns=columns)
balance_df['IsDefaulter'] = y_smote
sns.countplot('IsDefaulter', data = balance_df)
<AxesSubplot:xlabel='IsDefaulter', ylabel='count'>
balance_df[balance_df['IsDefaulter']==1]
| ID | LIMIT_BAL | SEX | EDUCATION | MARRIAGE | AGE | PAY_SEPT | PAY_AUG | PAY_JUL | PAY_JUN | ... | BILL_AMT_MAY | BILL_AMT_APR | PAY_AMT_SEPT | PAY_AMT_AUG | PAY_AMT_JUL | PAY_AMT_JUN | PAY_AMT_MAY | PAY_AMT_APR | default.payment.next.month | IsDefaulter | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 20000 | 2 | 2 | 1 | 24 | 2 | 2 | -1 | -1 | ... | 0 | 0 | 0 | 689 | 0 | 0 | 0 | 0 | 1 | 1 |
| 1 | 2 | 120000 | 2 | 2 | 2 | 26 | -1 | 2 | 0 | 0 | ... | 3455 | 3261 | 0 | 1000 | 1000 | 1000 | 0 | 2000 | 1 | 1 |
| 13 | 14 | 70000 | 1 | 2 | 2 | 30 | 1 | 2 | 2 | 0 | ... | 36137 | 36894 | 3200 | 0 | 3000 | 3000 | 1500 | 0 | 1 | 1 |
| 16 | 17 | 20000 | 1 | 1 | 2 | 24 | 0 | 0 | 2 | 2 | ... | 17905 | 19104 | 3200 | 0 | 1500 | 0 | 1650 | 0 | 1 | 1 |
| 21 | 22 | 120000 | 2 | 2 | 1 | 39 | -1 | -1 | -1 | -1 | ... | 632 | 316 | 316 | 316 | 0 | 632 | 316 | 0 | 1 | 1 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 46723 | 13814 | 50000 | 1 | 1 | 1 | 48 | 0 | 0 | 0 | 0 | ... | 10134 | 10399 | 1096 | 1956 | 500 | 2569 | 2251 | 1527 | 1 | 1 |
| 46724 | 10188 | 490830 | 1 | 1 | 1 | 43 | 0 | 0 | 0 | 0 | ... | 4222 | 12604 | 6598 | 5609 | 2958 | 3157 | 11477 | 1535 | 1 | 1 |
| 46725 | 7020 | 50000 | 2 | 2 | 1 | 23 | 1 | 0 | 0 | 0 | ... | 26650 | 27324 | 2000 | 2690 | 1458 | 4212 | 2391 | 2216 | 1 | 1 |
| 46726 | 10250 | 141190 | 1 | 1 | 1 | 45 | 0 | 0 | 0 | 0 | ... | 95712 | 85135 | 5274 | 4888 | 3641 | 7587 | 88313 | 2731 | 1 | 1 |
| 46727 | 21324 | 30000 | 1 | 2 | 1 | 33 | 0 | 2 | 2 | 2 | ... | 12608 | 10161 | 507 | 2470 | 846 | 494 | 208 | 421 | 1 | 1 |
23364 rows × 26 columns
df_fr = balance_df.copy()
df_fr['Payement_Value'] = df_fr['PAY_SEPT'] + df_fr['PAY_AUG'] + df_fr['PAY_JUL'] + df_fr['PAY_JUN'] + df_fr['PAY_MAY'] \
+ df_fr['PAY_APR']
df_fr.groupby('IsDefaulter')['Payement_Value'].mean()
IsDefaulter 0 -1.98014 1 1.68169 Name: Payement_Value, dtype: float64
plt.figure(figsize=(10,10))
sns.boxplot(data = df_fr, x = 'IsDefaulter', y = 'Payement_Value',showmeans=True)
<AxesSubplot:xlabel='IsDefaulter', ylabel='Payement_Value'>
df.columns
Index(['ID', 'LIMIT_BAL', 'SEX', 'EDUCATION', 'MARRIAGE', 'AGE', 'PAY_SEPT',
'PAY_AUG', 'PAY_JUL', 'PAY_JUN', 'PAY_MAY', 'PAY_APR', 'BILL_AMT_SEPT',
'BILL_AMT_AUG', 'BILL_AMT_JUL', 'BILL_AMT_JUN', 'BILL_AMT_MAY',
'BILL_AMT_APR', 'PAY_AMT_SEPT', 'PAY_AMT_AUG', 'PAY_AMT_JUL',
'PAY_AMT_JUN', 'PAY_AMT_MAY', 'PAY_AMT_APR',
'default.payment.next.month', 'IsDefaulter'],
dtype='object')
sorts=df_fr['Payement_Value'].sort_values()
sorts
23363 -12
27273 -12
27270 -12
27266 -12
27265 -12
..
2916 33
2362 33
18867 33
831 33
8654 36
Name: Payement_Value, Length: 46728, dtype: int32
q1=sorts.quantile(0.25)
q3=sorts.quantile(0.75)
print("The value of q1 is:",q1)
print("The value of q3 is:",q3)
The value of q1 is: -4.0 The value of q3 is: 2.0
q1=sorts.quantile(0.25)
q3=sorts.quantile(0.75)
print("The value of q1 is:",q1)
print("The value of q3 is:",q3)
The value of q1 is: -4.0 The value of q3 is: 2.0
iqr = q3 - q1
print("The value of iqr is:",iqr)
The value of iqr is: 6.0
upper=q1-1.5*iqr
lower=q3+1.5*iqr
print("The value of upper bound is:",round(upper))
print("The value of lower bound is:",round(lower))
The value of upper bound is: -13 The value of lower bound is: 11
clean_data=sorts[~((sorts<(upper)) | (sorts>(lower)))]
clean_data
23363 -12
27273 -12
27270 -12
27266 -12
27265 -12
..
37106 11
43346 11
32872 11
42371 11
5444 11
Name: Payement_Value, Length: 44769, dtype: int32
sns.boxplot(data=df_fr,x='Payement_Value',showmeans=True)
plt.show()
sns.boxplot(x=clean_data,showmeans=True)
plt.show()
var = ['BILL_AMT_SEPT',
'BILL_AMT_AUG', 'BILL_AMT_JUL', 'BILL_AMT_JUN', 'BILL_AMT_MAY',
'BILL_AMT_APR']
plt.figure(figsize = (8,8))
plt.title('Amount of bill statement (Apr-Sept) \ncorrelation plot (Pearson)')
corr = df[var].corr()
sns.heatmap(corr,xticklabels=corr.columns,yticklabels=corr.columns,linewidths=.1,vmin=-1, vmax=1)
plt.show()
class_0 = df.loc[df['default.payment.next.month'] == 0]["LIMIT_BAL"]
class_1 = df.loc[df['default.payment.next.month'] == 1]["LIMIT_BAL"]
plt.figure(figsize = (14,6))
plt.title('Default amount of credit limit - grouped by Payment Next Month (Density Plot)')
sns.set_color_codes("pastel")
sns.distplot(class_1,kde=True,bins=200, color="red")
sns.distplot(class_0,kde=True,bins=200, color="green")
plt.show()
df.columns
Index(['ID', 'LIMIT_BAL', 'SEX', 'EDUCATION', 'MARRIAGE', 'AGE', 'PAY_SEPT',
'PAY_AUG', 'PAY_JUL', 'PAY_JUN', 'PAY_MAY', 'PAY_APR', 'BILL_AMT_SEPT',
'BILL_AMT_AUG', 'BILL_AMT_JUL', 'BILL_AMT_JUN', 'BILL_AMT_MAY',
'BILL_AMT_APR', 'PAY_AMT_SEPT', 'PAY_AMT_AUG', 'PAY_AMT_JUL',
'PAY_AMT_JUN', 'PAY_AMT_MAY', 'PAY_AMT_APR',
'default.payment.next.month', 'IsDefaulter'],
dtype='object')
gender = df.groupby(['SEX', 'IsDefaulter']).size().unstack(1)
# 1 is the default for unstack, but I put it to show explicitly what we are unstacking
gender
| IsDefaulter | 0 | 1 |
|---|---|---|
| SEX | ||
| 1 | 9015 | 2873 |
| 2 | 14349 | 3763 |
import seaborn as sns
import matplotlib.pyplot as plt
# Example predictor variables and target variable
predictor_var1 = [2, 4, 6, 8, 10]
predictor_var2 = [1, 3, 5, 7, 9]
categorical_target = ['A', 'B', 'A', 'B', 'A']
# Create a DataFrame with the variables
data = pd.DataFrame({'Predictor_Var1': predictor_var1,
'Predictor_Var2': predictor_var2,
'Categorical_Target': categorical_target})
# Create a boxplot using seaborn
sns.boxplot(x='Categorical_Target', y='Predictor_Var1', data=data)
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# Example predictor variables and target variable
predictor_vars = {
'Predictor_Var1': [2, 4, 6, 8, 10],
'Predictor_Var2': [1, 3, 5, 7, 9],
'Predictor_Var3': [0, 2, 4, 6, 8]
}
categorical_target = ['A', 'B', 'A', 'B', 'A']
# Create a DataFrame with the variables
data = pd.DataFrame(predictor_vars)
data['Categorical_Target'] = categorical_target
# Create boxplots for each predictor variable
for var in predictor_vars:
plt.figure()
sns.boxplot(x='Categorical_Target', y=var, data=data,showmeans=True)
plt.title(var)
plt.show()
import pandas as pd
from scipy.stats import chi2_contingency
# Exemple de jeu de données avec des variables catégorielles
data = pd.DataFrame({'Caractéristique1': ['A', 'B', 'A', 'B', 'A'],
'Caractéristique2': ['X', 'Y', 'X', 'Y', 'X'],
'Cible': [1, 0, 1, 0, 1]})
# Créer une table de contingence
table_contingence = pd.crosstab(data['Caractéristique1'], data['Caractéristique2'])
# Effectuer le test du chi2
chi2, p_value, _, _ = chi2_contingency(table_contingence)
# Afficher les résultats
print("Valeur du chi2 :", chi2)
print("Valeur p :", p_value)
Valeur du chi2 : 1.7013888888888888 Valeur p : 0.1921064408679386
import pandas as pd
# Exemple de données
data = {
'colonne_a_modifier': ['123', '4567', '89', '987654321', '12']
}
# Charger les données dans un DataFrame
df = pd.DataFrame(data)
# Fonction pour ajouter des zéros
def ajouter_zeros(valeur):
zeros_a_ajouter = 9 - len(valeur)
return '0' * zeros_a_ajouter + valeur
# Appliquer la fonction sur la colonne spécifiée
colonne_a_modifier = 'colonne_a_modifier'
df[colonne_a_modifier] = df[colonne_a_modifier].apply(ajouter_zeros)
# Afficher le résultat
print(df)
colonne_a_modifier 0 000000123 1 000004567 2 000000089 3 987654321 4 000000012
import pandas as pd
# Exemple de données avec une colonne "ma_colonne" contenant des valeurs
data = {
"ma_colonne": [123, 4567, 89, 12345678, 98765432]
}
# Création du DataFrame à partir des données
df = pd.DataFrame(data)
# Fonction pour ajouter des zéros à gauche jusqu'à atteindre une taille de 9
def ajouter_zeros(valeur):
return str(valeur).zfill(9)
# Appliquer la fonction "ajouter_zeros" à la colonne "ma_colonne"
df["ma_colonne"] = df["ma_colonne"].apply(ajouter_zeros)
# Afficher le DataFrame après avoir ajouté des zéros
print(df)
ma_colonne 0 000000123 1 000004567 2 000000089 3 012345678 4 098765432
# Example string
my_string = "Hello"
# Add spaces to the right until the string reaches a length of 10
padded_string = my_string.rjust(10,'0')
print(padded_string) # Output: "Hello "
00000Hello
import pandas as pd
import numpy as np
# Générer des données aléatoires
np.random.seed(42)
n_samples = 1000
data = {
'id': range(1, n_samples + 1),
'date_arrete': pd.date_range(start='2020-01-01', periods=n_samples, freq='M'),
'annee': np.random.randint(2020, 2023, size=n_samples),
'mois': np.random.randint(1, 13, size=n_samples),
'age': np.random.randint(20, 70, size=n_samples),
'anciennete_bancaire_mois': np.random.randint(6, 240, size=n_samples),
'situation_matrimoniale': np.random.choice(['Célibataire', 'Marié', 'Divorcé', 'Veuf'], size=n_samples),
'solde_fin_mois': np.random.uniform(-5000, 50000, size=n_samples),
'nb_pret': np.random.randint(0, 5, size=n_samples),
'cumul_crediteur': np.random.uniform(0, 100000, size=n_samples),
'cumul_debiteur': np.random.uniform(0, 100000, size=n_samples),
'salaire': np.random.uniform(1000, 10000, size=n_samples),
'mtn_paiement_par_carte': np.random.uniform(0, 5000, size=n_samples),
'nb_paiement_par_carte': np.random.randint(0, 50, size=n_samples),
'nb_virement': np.random.randint(0, 20, size=n_samples),
'mnt_virement': np.random.uniform(0, 20000, size=n_samples),
'nb_versement': np.random.randint(0, 10, size=n_samples),
'mtn_versement': np.random.uniform(0, 10000, size=n_samples),
'mtn_paye': np.random.uniform(0, 10000, size=n_samples),
'mtn_impaye': np.random.uniform(0, 10000, size=n_samples),
'target': np.random.choice([0, 1], size=n_samples, p=[0.8, 0.2])
}
# Créer le DataFrame
df = pd.DataFrame(data)
print(df.shape)
# Afficher les premières lignes du DataFrame
df.head()
(1000, 21)
| id | date_arrete | annee | mois | age | anciennete_bancaire_mois | situation_matrimoniale | solde_fin_mois | nb_pret | cumul_crediteur | ... | salaire | mtn_paiement_par_carte | nb_paiement_par_carte | nb_virement | mnt_virement | nb_versement | mtn_versement | mtn_paye | mtn_impaye | target | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2020-01-31 | 2022 | 7 | 56 | 52 | Célibataire | 3954.827732 | 1 | 76944.257942 | ... | 5294.317384 | 1149.591854 | 32 | 15 | 5235.057381 | 9 | 8444.056123 | 9535.722238 | 6268.536213 | 0 |
| 1 | 2 | 2020-02-29 | 2020 | 3 | 51 | 83 | Veuf | 5280.294233 | 4 | 93479.551749 | ... | 2177.930247 | 2579.729393 | 32 | 9 | 10251.818505 | 0 | 4532.997386 | 8396.244959 | 736.182615 | 0 |
| 2 | 3 | 2020-03-31 | 2022 | 3 | 60 | 129 | Veuf | -3911.238791 | 3 | 90920.213621 | ... | 3120.093411 | 1267.468766 | 43 | 16 | 6612.016199 | 0 | 7264.413581 | 4260.008105 | 1896.963649 | 0 |
| 3 | 4 | 2020-04-30 | 2022 | 8 | 22 | 80 | Divorcé | 16487.516104 | 4 | 81962.486955 | ... | 9392.535578 | 4702.686506 | 19 | 0 | 17210.229732 | 6 | 955.362076 | 6447.168378 | 3378.538857 | 0 |
| 4 | 5 | 2020-05-31 | 2020 | 5 | 47 | 108 | Divorcé | 5528.522427 | 2 | 88819.134966 | ... | 8735.526781 | 4529.719840 | 46 | 17 | 9475.203075 | 2 | 3960.243463 | 1770.709219 | 778.700643 | 0 |
5 rows × 21 columns
anciennete_bancaire_mois = Chaque valeur représente le nombre de mois pendant lesquels un individu a été client de la banque
** Spécifiez la population ou le groupe sur lequel portera votre étude. Si vous étudiez un sous-ensemble de la population (échantillon), expliquez comment vous sélectionnerez les participants.
** Indiquez toute limitation géographique ou temporelle. Par exemple, vous pourriez vous concentrer sur une région ou une période spécifique.
** Mentionnez brièvement les méthodes de recherche que vous utiliserez pour collecter et analyser les données. S'agira-t-il de méthodes qualitatives, quantitatives ou de méthodes mixtes ?
** Soyez clair sur ce que vous ne couvrirez pas dans votre étude. Cela évite le débordement du champ d'étude et maintient la concentration sur vos objectifs principaux.
** Décrivez ce que vous avez l'intention de produire en résultat de votre étude. Il peut s'agir d'un rapport, d'une analyse, de recommandations ou d'autres résultats.
** Reconnaissez les prémisses que vous faites et les limitations qui pourraient affecter les résultats de l'étude.
est d'élaborer un modèle de scoring comportemental basé sur des données financières et comportementales des clients. Les principaux objectifs de cette étude sont les suivants :
Développer un Modèle de Scoring : Concevoir et construire un modèle prédictif qui évalue le comportement financier des clients et attribue un score en fonction de leurs antécédents de paiement, d'endettement, de dépenses et d'autres facteurs pertinents.
Évaluer le Risque de Défaut : L'objectif principal du scoring comportemental est d'évaluer le risque de défaut d'un individu ou d'une entité. Cela implique de développer un modèle qui peut prédire avec précision la probabilité qu'un emprunteur ou un client ne parvienne pas à rembourser ses dettes.
Identifer les Facteurs de Risque : Examiner les variables et les caractéristiques qui ont un impact significatif sur le comportement de remboursement. Cela peut inclure des variables telles que l'historique de paiement, le montant des dettes, l'ancienneté bancaire, etc.
Optimiser les Décisions de Crédit : Utiliser les scores comportementaux pour prendre des décisions éclairées en matière de crédit. Les scores peuvent aider les prêteurs à déterminer les limites de crédit appropriées, à évaluer la solvabilité et à personnaliser les offres de produits financiers.
Améliorer la Gestion des Risques : Fournir aux institutions financières un outil pour gérer efficacement les risques associés aux prêts et aux crédits. Cela peut conduire à des politiques de prêt plus ciblées et à une réduction des pertes.
Suivre les Comportements Financiers : Suivre l'évolution des comportements de paiement des clients au fil du temps. Cela peut aider à détecter les signes précoces de difficultés financières et à prendre des mesures correctives.
Personnalisation des Offres : Utiliser les scores comportementaux pour personnaliser les offres et les services financiers en fonction du profil et des habitudes de paiement de chaque individu.
Améliorer la Rentabilité : En réduisant les risques de défaut et en prenant des décisions plus précises en matière de crédit, les institutions financières peuvent améliorer leur rentabilité globale.
Validation et Ajustements du Modèle : Les objectifs incluent la validation et l'ajustement constants du modèle de scoring pour garantir sa précision et sa pertinence dans un environnement financier en évolution.
---------------boxplot pour voir la reartitions des données, taux de missing, considerer que les tzrget detecter
Q1 (premier quartile) : Le premier quartile divise les données en deux parties égales, où 25% des valeurs se situent en dessous de Q1. Cela signifie que 25% des données sont inférieures à Q1.
Q2 (deuxième quartile) : Q2 est simplement une autre appellation pour la médiane. Il divise les données en deux parties égales, où 50% des valeurs se situent en dessous de Q2 et 50% des valeurs se situent au-dessus de Q2.
Q3 (troisième quartile) : Le troisième quartile divise les données en deux parties égales, où 75% des valeurs se situent en dessous de Q3. Cela signifie que 25% des données sont supérieures à Q3
from IPython.display import Image
Image(filename='img.jpg')
# Grouper les données par la variable cible 'target'
grouped = df.groupby('target')
# Comparer les moyennes des variables numériques pour les deux groupes
numeric_vars = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement', 'mnt_virement', 'nb_versement',
'mtn_versement', 'mtn_paye', 'mtn_impaye']
plt.figure(figsize=(15, 10))
for var in numeric_vars:
plt.subplot(4, 4, numeric_vars.index(var) + 1)
sns.boxplot(data=df, x='target', y=var,showmeans=True)
plt.title(var)
plt.tight_layout()
plt.show()
# Variables numériques que vous souhaitez analyser
numeric_variables = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'salaire']
# Boucle pour créer des histogrammes pour chaque variable numérique
for variable in numeric_variables:
plt.figure(figsize=(10, 6))
# Histogramme pour les clients en défaut (target = 1)
plt.hist(df[df['target'] == 1][variable], bins=20, color='red', alpha=0.5, label='Défaut (1)')
# Histogramme pour les clients non en défaut (target = 0)
plt.hist(df[df['target'] == 0][variable], bins=20, color='blue', alpha=0.5, label='Pas en Défaut (0)')
plt.title(f'Distribution de {variable} en fonction du Target')
plt.xlabel(variable)
plt.ylabel('Fréquence')
plt.legend()
plt.grid(True)
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
# Séparer les données en fonction du target
df_target_0 = df[df['target'] == 0]
df_target_1 = df[df['target'] == 1]
# Liste des colonnes numériques à visualiser
numeric_columns = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire', 'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement', 'mnt_virement', 'nb_versement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Ajuster la taille du graphique
plt.figure(figsize=(30, 15))
# Tracer les courbes de densité de probabilité pour chaque variable numérique
for col in numeric_columns:
plt.subplot(4, 4, numeric_columns.index(col) + 1) # Créer une grille 4x4 de sous-graphiques
sns.kdeplot(data=df_target_0[col], label='Non Défaut (0)', shade=True)
sns.kdeplot(data=df_target_1[col], label='Défaut (1)', shade=True)
plt.title(col)
plt.xlabel('')
plt.ylabel('Densité')
plt.legend()
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
# Afficher le graphique
plt.show()
df.columns
Index(['id', 'date_arrete', 'annee', 'mois', 'age', 'anciennete_bancaire_mois',
'situation_matrimoniale', 'solde_fin_mois', 'nb_pret',
'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement',
'mnt_virement', 'nb_versement', 'mtn_versement', 'mtn_paye',
'mtn_impaye', 'target', 'anciennete_bancaire_range', 'dettes_cumulees',
'paiement_anormaux', 'salaire_range', 'age_group', 'constante'],
dtype='object')
import pandas as pd
# Charger le DataFrame depuis le code que vous avez fourni
# Assurez-vous que le DataFrame 'df' est déjà créé
# Grouper par année et target, puis calculer les statistiques
grouped_stats = df.groupby(['annee', 'target'])[['cumul_crediteur', 'cumul_debiteur', 'solde_fin_mois', 'salaire']].describe()
# Afficher les statistiques
grouped_stats
| cumul_crediteur | cumul_debiteur | ... | solde_fin_mois | salaire | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | mean | std | min | 25% | 50% | 75% | max | count | mean | ... | 75% | max | count | mean | std | min | 25% | 50% | 75% | max | ||
| annee | target | |||||||||||||||||||||
| 2020 | 0 | 10.0 | 60315.049538 | 29259.192734 | 19921.968584 | 31505.656129 | 65699.895204 | 87104.972963 | 93479.551749 | 10.0 | 44480.163809 | ... | 18420.046223 | 46424.693751 | 10.0 | 5976.076397 | 2745.892826 | 2177.930247 | 3663.649404 | 5511.469854 | 8398.661448 | 9691.933995 |
| 1 | 2.0 | 26846.684718 | 15356.532663 | 15987.976337 | 21417.330528 | 26846.684718 | 32276.038909 | 37705.393100 | 2.0 | 53489.980237 | ... | 36109.863440 | 43289.147334 | 2.0 | 9038.570957 | 1044.580366 | 8299.941097 | 8669.256027 | 9038.570957 | 9407.885887 | 9777.200818 | |
| 2021 | 0 | 12.0 | 45292.131517 | 24051.312095 | 8744.650180 | 27462.299640 | 45843.083045 | 65696.243325 | 79644.056152 | 12.0 | 58438.033623 | ... | 38007.930677 | 49012.724536 | 12.0 | 5491.658173 | 2790.446199 | 1801.087614 | 2885.173975 | 5124.370327 | 7597.883717 | 9383.899664 |
| 2022 | 0 | 9.0 | 32191.769939 | 32781.744437 | 3981.143945 | 10868.253937 | 17909.493933 | 39221.779343 | 95564.946727 | 9.0 | 48227.588614 | ... | 48740.732818 | 49469.898010 | 9.0 | 5350.240096 | 3388.186533 | 1645.618094 | 2434.553963 | 5039.662291 | 9184.992976 | 9712.199548 |
| 1 | 3.0 | 75124.645335 | 34548.672821 | 35232.705425 | 65005.337611 | 94777.969797 | 95070.615290 | 95363.260783 | 3.0 | 14979.273329 | ... | 46040.097988 | 46769.984653 | 3.0 | 3113.171707 | 1429.491544 | 2090.399151 | 2296.475381 | 2502.551611 | 3624.557984 | 4746.564357 | |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2101 | 1 | 4.0 | 51578.167060 | 39272.706928 | 13574.585310 | 23281.451916 | 46401.526441 | 74698.241584 | 99935.030047 | 4.0 | 73539.594378 | ... | 10905.896644 | 12465.501893 | 4.0 | 4891.369035 | 3599.727571 | 1219.518938 | 2535.292443 | 4457.138166 | 6813.214758 | 9431.680871 |
| 2102 | 0 | 9.0 | 50631.868072 | 34701.808267 | 8839.696715 | 27171.759890 | 34222.552478 | 81595.578942 | 98138.333424 | 9.0 | 40720.993768 | ... | 36749.781291 | 45094.146903 | 9.0 | 4774.412869 | 3085.254252 | 1340.381229 | 3102.223908 | 3371.261011 | 7475.139709 | 9877.149306 |
| 1 | 3.0 | 29821.051703 | 17256.175426 | 10015.499751 | 23923.530234 | 37831.560717 | 39723.827679 | 41616.094641 | 3.0 | 28675.429423 | ... | 30208.018952 | 35014.107662 | 3.0 | 1777.788179 | 511.800724 | 1188.185611 | 1612.947712 | 2037.709813 | 2072.589463 | 2107.469112 | |
| 2103 | 0 | 3.0 | 65785.477335 | 43344.788587 | 16653.851350 | 49369.376138 | 82084.900926 | 90351.290327 | 98617.679728 | 3.0 | 27962.971434 | ... | 26394.581561 | 35364.795735 | 3.0 | 2149.001938 | 773.088850 | 1508.641217 | 1719.597823 | 1930.554430 | 2469.182298 | 3007.810166 |
| 1 | 1.0 | 28147.730245 | NaN | 28147.730245 | 28147.730245 | 28147.730245 | 28147.730245 | 28147.730245 | 1.0 | 79554.439193 | ... | 1906.106825 | 1906.106825 | 1.0 | 4883.573079 | NaN | 4883.573079 | 4883.573079 | 4883.573079 | 4883.573079 | 4883.573079 | |
162 rows × 32 columns
import pandas as pd
# Charger le DataFrame depuis le code que vous avez fourni
# Assurez-vous que le DataFrame 'df' est déjà créé
# Sélectionner les colonnes d'intérêt
columns_of_interest = ['annee', 'cumul_crediteur', 'cumul_debiteur', 'mtn_paye', 'target']
# Filtrer les clients ayant des valeurs non nulles pour les cumuls créditeurs, débiteurs et montants payés
filtered_df = df[df['cumul_crediteur'] > 0.0]
filtered_df = filtered_df[filtered_df['cumul_debiteur'] > 0.0]
filtered_df = filtered_df[filtered_df['mtn_paye'] > 0.0]
# Grouper par année, target et compter le nombre de clients
grouped_counts = filtered_df.groupby(['annee', 'target']).size().reset_index(name='nombre_de_clients')
# Afficher les résultats
grouped_counts
| annee | target | nombre_de_clients | |
|---|---|---|---|
| 0 | 2020 | 0 | 10 |
| 1 | 2020 | 1 | 2 |
| 2 | 2021 | 0 | 12 |
| 3 | 2022 | 0 | 9 |
| 4 | 2022 | 1 | 3 |
| ... | ... | ... | ... |
| 157 | 2101 | 1 | 4 |
| 158 | 2102 | 0 | 9 |
| 159 | 2102 | 1 | 3 |
| 160 | 2103 | 0 | 3 |
| 161 | 2103 | 1 | 1 |
162 rows × 3 columns
# Créer un tableau croisé dynamique pour le nombre de clients par année et target
pivot_table = pd.pivot_table(df, values='id', index='annee', columns='target', aggfunc='count', fill_value=0)
# Renommer les colonnes du tableau
pivot_table.columns = ['Non Défaut (0)', 'Défaut (1)']
# Afficher le tableau
pivot_table
| Non Défaut (0) | Défaut (1) | |
|---|---|---|
| annee | ||
| 2020 | 10 | 2 |
| 2021 | 12 | 0 |
| 2022 | 9 | 3 |
| 2023 | 11 | 1 |
| 2024 | 12 | 0 |
| ... | ... | ... |
| 2099 | 9 | 3 |
| 2100 | 10 | 2 |
| 2101 | 8 | 4 |
| 2102 | 9 | 3 |
| 2103 | 3 | 1 |
84 rows × 2 columns
df.columns
Index(['id', 'date_arrete', 'annee', 'mois', 'age', 'anciennete_bancaire_mois',
'situation_matrimoniale', 'solde_fin_mois', 'nb_pret',
'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement',
'mnt_virement', 'nb_versement', 'mtn_versement', 'mtn_paye',
'mtn_impaye', 'target', 'anciennete_bancaire_range', 'dettes_cumulees',
'paiement_anormaux', 'salaire_range', 'age_group', 'constante'],
dtype='object')
import pandas as pd
# Supposons que votre DataFrame s'appelle 'df'
# Regrouper les données par année et par target, puis calculer la somme des montants cumulés dans chaque groupe
total_cumul_by_year = df.groupby(['annee', 'target'])['cumul_crediteur'].sum().reset_index()
# Renommer la colonne 'cumul_crediteur' en 'montant_total_cumul'
total_cumul_by_year.rename(columns={'cumul_crediteur': 'montant_total_cumul'}, inplace=True)
total_cumul_by_year
| annee | target | montant_total_cumul | |
|---|---|---|---|
| 0 | 2020 | 0 | 603150.495384 |
| 1 | 2020 | 1 | 53693.369437 |
| 2 | 2021 | 0 | 543505.578206 |
| 3 | 2022 | 0 | 289725.929447 |
| 4 | 2022 | 1 | 225373.936005 |
| ... | ... | ... | ... |
| 157 | 2101 | 1 | 206312.668239 |
| 158 | 2102 | 0 | 455686.812646 |
| 159 | 2102 | 1 | 89463.155108 |
| 160 | 2103 | 0 | 197356.432004 |
| 161 | 2103 | 1 | 28147.730245 |
162 rows × 3 columns
# Supposons que votre DataFrame s'appelle 'df'
data = df[df.annee.isin([2020, 2021, 2022, 2023])]
# Calculer le nombre total de clients par année et par target
total_clients_by_year = data.groupby(['annee', 'target'])['cumul_crediteur'].count().unstack()
# Définir un style esthétique avec Seaborn
sns.set_style("whitegrid")
sns.set_palette("Set2")
# Créer un graphique en barres pour le nombre total de clients par année et target
plt.figure(figsize=(10, 6))
total_clients_by_year.plot(kind='bar', stacked=True)
plt.title("Nombre Total de Clients par Année et Target")
plt.xlabel("Année")
plt.ylabel("Nombre Total de Clients")
plt.legend(title='Target', labels=['Non Défaut (0)', 'Défaut (1)'])
plt.xticks(rotation=45) # Rotation des étiquettes pour une meilleure lisibilité
plt.tight_layout() # Ajuster la disposition pour éviter la superposition
plt.show()
<Figure size 720x432 with 0 Axes>
# Regrouper les données par année et par target, puis calculer la somme des montants cumulés dans chaque groupe
grouped_data = data.groupby(['annee', 'target']).agg({
'cumul_crediteur': 'sum',
'mtn_paye': 'sum',
'mtn_impaye': 'sum',
'mnt_virement': 'sum',
# Ajoutez d'autres colonnes si nécessaire
}).reset_index()
# Renommer les colonnes pour une meilleure lisibilité
grouped_data.rename(columns={
'cumul_crediteur': 'Montant Total Cumulé',
'mtn_paye': 'Montant Payé',
'mtn_impaye': 'Montant Impayé',
'mnt_virement': 'Montant Virement',
# Ajoutez d'autres renommages de colonnes si nécessaire
}, inplace=True)
grouped_data
| annee | target | Montant Total Cumulé | Montant Payé | Montant Impayé | Montant Virement | |
|---|---|---|---|---|---|---|
| 0 | 2020 | 0 | 603150.495384 | 65073.306289 | 34852.180604 | 113969.874566 |
| 1 | 2020 | 1 | 53693.369437 | 15068.583344 | 12421.236445 | 17575.435891 |
| 2 | 2021 | 0 | 543505.578206 | 52487.103545 | 81360.849807 | 103705.814461 |
| 3 | 2022 | 0 | 289725.929447 | 57687.575657 | 48920.996739 | 108465.728662 |
| 4 | 2022 | 1 | 225373.936005 | 20287.244474 | 9023.106442 | 35387.837379 |
| 5 | 2023 | 0 | 670564.042057 | 57087.396730 | 45482.269067 | 109889.847172 |
| 6 | 2023 | 1 | 91764.727790 | 3429.351158 | 7477.652771 | 1772.659495 |
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Supposons que votre DataFrame s'appelle 'df'
# Regrouper les données par année et par target, puis calculer la somme des montants dans chaque groupe
grouped_data = data.groupby(['annee', 'target']).agg({
'cumul_crediteur': 'sum',
'mtn_paye': 'sum',
'mtn_impaye': 'sum',
'mnt_virement': 'sum'
}).reset_index()
# Définir un style esthétique avec Seaborn
sns.set_style("whitegrid")
sns.set_palette("Set2")
# Créer des sous-plots pour chaque montant en fonction du target et de l'année
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
fig.suptitle("Sommes des Montants en Fonction du Target et de l'Année")
# Montant Total Cumulé
sns.barplot(data=grouped_data, x='annee', y='cumul_crediteur', hue='target', ax=axes[0, 0])
axes[0, 0].set_title("Montant Total Cumulé")
axes[0, 0].set_xlabel("Année")
axes[0, 0].set_ylabel("Montant")
# Montant Payé
sns.barplot(data=grouped_data, x='annee', y='mtn_paye', hue='target', ax=axes[0, 1])
axes[0, 1].set_title("Montant Payé")
axes[0, 1].set_xlabel("Année")
axes[0, 1].set_ylabel("Montant")
# Montant Impayé
sns.barplot(data=grouped_data, x='annee', y='mtn_impaye', hue='target', ax=axes[1, 0])
axes[1, 0].set_title("Montant Impayé")
axes[1, 0].set_xlabel("Année")
axes[1, 0].set_ylabel("Montant")
# Montant de Virement
sns.barplot(data=grouped_data, x='annee', y='mnt_virement', hue='target', ax=axes[1, 1])
axes[1, 1].set_title("Montant de Virement")
axes[1, 1].set_xlabel("Année")
axes[1, 1].set_ylabel("Montant")
# Ajuster l'espacement entre les sous-plots
plt.tight_layout()
plt.subplots_adjust(top=0.9)
# Afficher les graphiques
plt.show()
import pandas as pd
# Supposons que votre DataFrame s'appelle 'df'
# Créer une nouvelle colonne pour les classes de situation matrimoniale
def categorize_marital_status(status):
if status in ['Divorcé', 'Veuf']:
return 'Divorcé/Veuf'
elif status == 'Célibataire':
return 'Célibataire'
elif status == 'Marié':
return 'Marié'
else:
return 'Autre' # Vous pouvez gérer d'autres valeurs si nécessaire
data['marital_status_group'] = data['situation_matrimoniale'].apply(categorize_marital_status)
# Regrouper les données par année, par classe de situation matrimoniale et par target, puis compter le nombre de clients dans chaque groupe
grouped_data = df.groupby(['annee', 'marital_status_group', 'target'])['id'].count().unstack().reset_index()
grouped_data
| target | annee | marital_status_group | 0 | 1 |
|---|---|---|---|---|
| 0 | 2020 | Célibataire | 2.0 | 1.0 |
| 1 | 2020 | Divorcé/Veuf | 7.0 | NaN |
| 2 | 2020 | Marié | 1.0 | 1.0 |
| 3 | 2021 | Célibataire | 2.0 | NaN |
| 4 | 2021 | Divorcé/Veuf | 6.0 | NaN |
| 5 | 2021 | Marié | 4.0 | NaN |
| 6 | 2022 | Célibataire | NaN | 2.0 |
| 7 | 2022 | Divorcé/Veuf | 6.0 | NaN |
| 8 | 2022 | Marié | 3.0 | 1.0 |
| 9 | 2023 | Célibataire | 2.0 | NaN |
| 10 | 2023 | Divorcé/Veuf | 6.0 | NaN |
| 11 | 2023 | Marié | 3.0 | 1.0 |
df.situation_matrimoniale.unique()
array(['Divorcé', 'Célibataire', 'Marié', 'Veuf'], dtype=object)
Quel est l'effet des montants des dettes cumulées sur la capacité à rembourser les crédits ? L'effet des montants de dettes cumulées sur la capacité à rembourser les crédits peut avoir des implications significatives pour la solvabilité d'un individu. En termes simples, cela se réfère à la question de savoir comment le total des dettes qu'une personne a accumulées peut influencer sa capacité à honorer ses engagements financiers, tels que les remboursements de crédits. Imaginons un scénario où un individu a accumulé un montant élevé de dettes provenant de différents prêts, cartes de crédit ou autres obligations financières. Plus ce montant de dettes cumulées est élevé, plus il peut y avoir de pression sur les ressources financières de cette personne
Dans quelle mesure les comportements de paiement passés peuvent-ils prédire les comportements futurs en matière de crédit ?
XxxxXxxxLes habitudes de paiement par carte (montant et fréquence) sont-elles liées à la performance de remboursement ?
Comment les comportements financiers varient-ils en fonction de l'âge des emprunteurs ?
Célibataire (Single): Le taux de défaut moyen pour les personnes célibataires est d'environ 20.91%. Cela signifie que parmi les emprunteurs célibataires, environ 20.91% ont tendance à ne pas rembourser leurs crédits en temps voulu.
Divorcé (Divorced): Les emprunteurs divorcés ont un taux de défaut moyen d'environ 20.65%. Cela indique qu'environ 20.65% des personnes divorcées ont des difficultés à honorer leurs obligations de paiement.
Marié (Married): Les personnes mariées ont un taux de défaut moyen d'environ 21.37%. Cela implique que près de 21.37% des emprunteurs mariés ne remboursent pas leurs crédits de manière adéquate.
Veuf (Widowed): Les emprunteurs veufs affichent un taux de défaut moyen d'environ 19.14%. Cela suggère que 19.14% des personnes veuves connaissent des problèmes de remboursement.
En interprétant ces résultats, on peut dire qu'il y a des différences légères entre les taux de défaut moyens pour différents groupes d'état matrimonial. Cependant, les variations ne semblent pas être très prononcées. En substance, les taux de défaut ne varient pas considérablement en fonction de l'état matrimonial des emprunteurs dans cet ensemble de données. Cela suggère que l'état matrimonial seul pourrait ne pas être un facteur majeur dans la prédiction des comportements de remboursement, du moins dans le contexte de cette analyse.
# Grouper les données par état matrimonial et calculer le taux de défaut moyen
grouped = df.groupby('situation_matrimoniale')['target'].mean().reset_index()
# Créer un graphique pour visualiser les variations avec les taux de défaut affichés sur les barres
plt.figure(figsize=(10, 6))
bars = plt.bar(grouped['situation_matrimoniale'], grouped['target'], color='skyblue')
plt.title('Taux de Défaut par État Matrimonial')
plt.xlabel('État Matrimonial')
plt.ylabel('Taux de Défaut')
plt.xticks(rotation=45)
plt.tight_layout()
# Afficher les taux de défaut au-dessus des barres
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval, round(yval, 2), ha='center', va='bottom', fontsize=10)
plt.show()
# Créer un graphique de dispersion et une ligne de régression pour visualiser la corrélation
plt.figure(figsize=(10, 6))
sns.regplot(x='anciennete_bancaire_mois', y='target', data=df)#, logistic=True)
plt.xlabel("Ancienneté Bancaire (mois)")
plt.ylabel("Probabilité de Défaut")
plt.title("Corrélation entre Ancienneté Bancaire et Probabilité de Défaut")
plt.show()
# Calculer la corrélation entre les deux variables
correlation = df['anciennete_bancaire_mois'].corr(df['target'])
print(f"Corrélation entre Ancienneté Bancaire et Probabilité de Défaut : {correlation:.4f}")
Corrélation entre Ancienneté Bancaire et Probabilité de Défaut : 0.0355
df['anciennete_bancaire_range'] = pd.cut(df['anciennete_bancaire_mois'], bins=3)
default_by_seniority = df.groupby('anciennete_bancaire_range')['target'].mean()
plt.figure(figsize=(10, 6))
bar_plot = default_by_seniority.plot(kind='bar', color='green', alpha=0.7)
plt.xlabel('Tranche d\'Ancienneté Bancaire')
plt.ylabel('Probabilité de Défaut Moyenne')
plt.title('Probabilité de Défaut Moyenne par Tranche d\'Ancienneté Bancaire')
plt.xticks(rotation=45)
# Ajouter les annotations des probabilités moyennes sur les barres
for index, value in enumerate(default_by_seniority):
bar_plot.annotate(f'{value:.2f}', xy=(index, value), ha='center', va='bottom')
plt.show()
# Supposons que votre DataFrame a une colonne 'target' (1 pour défaut, 0 pour non-défaut)
data_defaut = df[df['target'] == 1]
data_non_defaut = df[df['target'] == 0]
# Analyse des paiements par carte au fil du temps pour chaque groupe
paiements_defaut = data_defaut.groupby('annee')['solde_fin_mois'].sum()
paiements_non_defaut = data_non_defaut.groupby('annee')['solde_fin_mois'].sum()
# Créez le graphique de ligne comparatif
plt.figure(figsize=(10, 6))
plt.plot(paiements_defaut.index, paiements_defaut.values, label='En Défaut')
plt.plot(paiements_non_defaut.index, paiements_non_defaut.values, label='Non en Défaut')
plt.xlabel('Année')
plt.ylabel('Montant solde_fin_mois')
plt.title('Comparaison des solde_fin_mois au Fil des Années')
plt.legend()
plt.grid(True)
plt.show()
# Supposons que votre DataFrame a une colonne 'target' (1 pour défaut, 0 pour non-défaut)
data_defaut = df[df['target'] == 1]
data_non_defaut = df[df['target'] == 0]
# Calculez la somme des paiements par carte pour chaque année et chaque groupe
paiements_defaut = data_defaut.groupby(['annee'])['mtn_paye'].sum()
paiements_non_defaut = data_non_defaut.groupby(['annee'])['mtn_paye'].sum()
# Créez le graphique à barres comparatif
plt.figure(figsize=(10, 6))
width = 0.35
plt.bar(paiements_defaut.index, paiements_defaut.values, width, label='En Défaut')
plt.bar(paiements_non_defaut.index + width, paiements_non_defaut.values, width, label='Non en Défaut')
plt.xlabel('Année')
plt.ylabel('Montant Total des Paiements par Carte')
plt.title('Comparaison des Paiements')
plt.xticks(paiements_defaut.index + width / 2, paiements_defaut.index)
plt.legend()
plt.grid(True)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# Supposons que vous avez un DataFrame df avec une colonne 'annee' et une colonne 'mnt_paiement_par_carte'
data=df[df.annee.isin([2020,2021,2022,2023])]
# Regroupez les données par année et calculez la somme des paiements par carte pour chaque année
soldes_par_annee = data.groupby('annee')['solde_fin_mois'].sum()
# Créez le graphique en barres
plt.figure(figsize=(10, 6))
soldes_par_annee.plot(kind='bar', color='blue')
# Ajoutez des labels et un titre
plt.xlabel('Année')
plt.ylabel('Montant Total des Paiements par Carte')
plt.title('Évolution des Paiements par Carte au Fil des Années (Graphique en Barres)')
# Afficher les valeurs numériques au-dessus de chaque barre
for index, value in enumerate(soldes_par_annee):
plt.text(index, value, f"{value:.2f}", ha='center', va='bottom')
# Affichez le graphique
plt.show()
# Calculez le montant total de paiements par carte, virements et versements pour chaque année et chaque groupe
montant_paiement_par_carte_defaut = df[df['target'] == 1].groupby('annee')['mtn_paiement_par_carte'].sum()
montant_paiement_par_carte_non_defaut = df[df['target'] == 0].groupby('annee')['mtn_paiement_par_carte'].sum()
montant_virement_defaut = df[df['target'] == 1].groupby('annee')['mnt_virement'].sum()
montant_virement_non_defaut = df[df['target'] == 0].groupby('annee')['mnt_virement'].sum()
montant_versement_defaut = df[df['target'] == 1].groupby('annee')['mtn_versement'].sum()
montant_versement_non_defaut = df[df['target'] == 0].groupby('annee')['mtn_versement'].sum()
# Créez les graphiques en barres groupées
fig, axes = plt.subplots(3, 1, figsize=(10, 18))
def create_grouped_bar_chart(ax, data1, data2, label1, label2, ylabel):
width = 0.35
x = data1.index
ax.bar(x, data1, width, label=label1)
ax.bar(x, data2, width, bottom=data1, label=label2)
ax.set_ylabel(ylabel)
ax.set_title(f'Évolution des Montants par Année et Statut de Défaut')
ax.set_xticks(x)
ax.set_xticklabels(data1.index)
ax.legend()
ax.grid(True)
create_grouped_bar_chart(axes[0], montant_paiement_par_carte_defaut, montant_paiement_par_carte_non_defaut, 'En Défaut', 'Non en Défaut', 'Montant Paiement par Carte')
create_grouped_bar_chart(axes[1], montant_virement_defaut, montant_virement_non_defaut, 'En Défaut', 'Non en Défaut', 'Montant Virement')
create_grouped_bar_chart(axes[2], montant_versement_defaut, montant_versement_non_defaut, 'En Défaut', 'Non en Défaut', 'Montant Versement')
# Afficher les valeurs sur les barres
for ax in axes:
for p in ax.patches:
ax.annotate(f'{int(p.get_height()):,}', (p.get_x() + p.get_width() / 2., p.get_height()),
ha='center', va='center', fontsize=10, color='black', xytext=(0, 5),
textcoords='offset points')
plt.tight_layout()
plt.show()
# Créer un graphique de dispersion et une ligne de régression pour visualiser la corrélation
plt.figure(figsize=(10, 6))
sns.regplot(x='mtn_impaye', y='target', data=df)#, logistic=True)
plt.xlabel("mtn_paye")
plt.ylabel("Probabilité de Défaut")
plt.title("Corrélation entre Ancienneté Bancaire et Probabilité de Défaut")
plt.show()
# Calculer la corrélation entre les deux variables
correlation = df['anciennete_bancaire_mois'].corr(df['target'])
print(f"Corrélation entre mtn_impaye et Probabilité de Défaut : {correlation:.4f}")
Corrélation entre mtn_impaye et Probabilité de Défaut : 0.0355
# Créer un graphique de dispersion et une ligne de régression pour visualiser la corrélation
plt.figure(figsize=(10, 6))
sns.regplot(x='mtn_paye', y='target', data=df)#, logistic=True)
plt.xlabel("mtn_paye")
plt.ylabel("Probabilité de Défaut")
plt.title("Corrélation entre Ancienneté Bancaire et Probabilité de Défaut")
plt.show()
# Calculer la corrélation entre les deux variables
correlation = df['anciennete_bancaire_mois'].corr(df['target'])
print(f"Corrélation entre mtn_paye et Probabilité de Défaut : {correlation:.4f}")
Corrélation entre mtn_paye et Probabilité de Défaut : 0.0355
Q1 (premier quartile) : Le premier quartile divise les données en deux parties égales, où 25% des valeurs se situent en dessous de Q1. Cela signifie que 25% des données sont inférieures à Q1.
Q2 (deuxième quartile) : Q2 est simplement une autre appellation pour la médiane. Il divise les données en deux parties égales, où 50% des valeurs se situent en dessous de Q2 et 50% des valeurs se situent au-dessus de Q2.
Q3 (troisième quartile) : Le troisième quartile divise les données en deux parties égales, où 75% des valeurs se situent en dessous de Q3. Cela signifie que 25% des données sont supérieures à Q3
from IPython.display import Image
Image(filename='img.jpg')
# Grouper les données par la variable cible 'target'
grouped = df.groupby('target')
# Comparer les moyennes des variables numériques pour les deux groupes
numeric_vars = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement', 'mnt_virement', 'nb_versement',
'mtn_versement', 'mtn_paye', 'mtn_impaye']
plt.figure(figsize=(15, 10))
for var in numeric_vars:
plt.subplot(4, 4, numeric_vars.index(var) + 1)
sns.boxplot(data=df, x='target', y=var,showmeans=True)
plt.title(var)
plt.tight_layout()
plt.show()
# Comparer les proportions des catégories de la variable 'situation_matrimoniale' pour les deux groupes
plt.figure(figsize=(8, 6))
sns.countplot(data=df, x='situation_matrimoniale', hue='target')
plt.title('Répartition par Situation Matrimoniale')
plt.legend(title='Défaut')
plt.show()
df['salaire_range'] = pd.cut(df['salaire'], bins=2)
default_by_seniority = df.groupby('salaire_range')['target'].mean()
plt.figure(figsize=(10, 6))
bar_plot = default_by_seniority.plot(kind='bar', color='green', alpha=0.7)
plt.xlabel('Tranche de salaire_range')
plt.ylabel('Probabilité de Défaut Moyenne')
plt.title('Probabilité de Défaut Moyenne par Tranche de salaire_range')
plt.xticks(rotation=45)
# Ajouter les annotations des probabilités moyennes sur les barres
for index, value in enumerate(default_by_seniority):
bar_plot.annotate(f'{value:.2f}', xy=(index, value), ha='center', va='bottom')
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# Chargement du DataFrame (vous pouvez remplacer cette partie par votre propre DataFrame)
# df = ...
# Définition des classes d'âge
age_bins = [20, 30, 40, 50, 60, 70]
age_labels = ['20-29', '30-39', '40-49', '50-59', '60-69']
# Ajout d'une colonne pour la classe d'âge
df['age_group'] = pd.cut(df['age'], bins=age_bins, labels=age_labels, right=False)
# Calcul des agrégats en fonction de la classe d'âge
age_group_means = df.groupby('age_group').agg({
'cumul_crediteur': 'mean', # Montant moyen cumulé créditeur
'cumul_debiteur': 'mean', # Montant moyen cumulé débiteur
'salaire': 'mean', # Salaire moyen
'mtn_paiement_par_carte': 'mean', # Montant moyen paiement par carte
'target': 'mean' # Taux de Défaut moyen
}).reset_index()
# Création du graphique
plt.figure(figsize=(10, 6))
plt.plot(age_group_means['age_group'], age_group_means['cumul_crediteur'], label='Cumul Créditeur', marker='o')
plt.plot(age_group_means['age_group'], age_group_means['cumul_debiteur'], label='Cumul Débiteur', marker='s')
plt.plot(age_group_means['age_group'], age_group_means['salaire'], label='Salaire', marker='^')
plt.plot(age_group_means['age_group'], age_group_means['mtn_paiement_par_carte'], label='Montant Paiement par Carte', marker='D')
plt.plot(age_group_means['age_group'], age_group_means['target'], label='Taux de Défaut', marker='v')
plt.xlabel('Classe d\'Âge')
plt.ylabel('Valeurs Moyennes')
plt.title('Comportements Financiers en Fonction de la Classe d\'Âge')
plt.legend()
plt.grid(True)
plt.show()
data=df[df.annee.isin([2020,2021,2022,2023])]
# Calculer la fréquence des défauts par mois
defauts_par_mois = data.groupby(['annee', 'mois'])['target'].mean()
# Créer un graphique
plt.figure(figsize=(10, 6))
defauts_par_mois.plot(marker='o')
plt.title("Taux de Défauts de Paiement par Mois")
plt.xlabel("Mois")
plt.ylabel("Taux de Défauts")
plt.xticks(rotation=45)
plt.grid(True)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# Agrégation des données par mois et calcul du taux de défaut
monthly_defaults = df.groupby('mois')['target'].mean()
# Création du graphique
plt.figure(figsize=(10, 6))
plt.plot(monthly_defaults.index, monthly_defaults.values, marker='o')
plt.title("Taux de Défaut de Paiement en Fonction des Mois")
plt.xlabel("Mois")
plt.ylabel("Taux de Défaut de Paiement")
plt.xticks(range(1, 13), ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Déc'])
plt.grid(True)
plt.show()
data=df[df.annee.isin([2020,2021,2022])]
# Agrégation des données par année et mois et calcul du taux de défaut
yearly_monthly_defaults = data.groupby(['annee', 'mois'])['target'].mean().reset_index()
# Création du graphique
plt.figure(figsize=(12, 6))
# Utilisation d'une boucle pour itérer à travers chaque année
for year in sorted(yearly_monthly_defaults['annee'].unique()):
data_year = yearly_monthly_defaults[yearly_monthly_defaults['annee'] == year]
plt.plot(data_year['mois'], data_year['target'], marker='o', label=str(year))
plt.title("Taux de Défaut de Paiement en Fonction des Mois et des Années")
plt.xlabel("Mois")
plt.ylabel("Taux de Défaut de Paiement")
plt.xticks(range(1, 13), ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Déc'])
plt.legend(title='Année')
plt.grid(True)
plt.show()
data=df[df.annee.isin([2020,2021,2022])]
# Agrégation des données par mois et calcul du taux de défaut
monthly_defaults = data.groupby('annee')['target'].mean()
# Création du graphique
plt.figure(figsize=(10, 6))
plt.plot(monthly_defaults.index, monthly_defaults.values, marker='o')
plt.title("Taux de Défaut de Paiement en Fonction des anees")
plt.xlabel("annee")
plt.ylabel("Taux de Défaut de Paiement")
plt.xticks(range(1, 4), ['2020', '2021', '2022'])
plt.grid(True)
plt.show()
import pandas as pd
import statsmodels.api as sm
# Charger le DataFrame depuis le code que vous avez fourni
# Assurez-vous que le DataFrame 'df' est déjà créé
# Sélectionner les variables indépendantes (caractéristiques) pour la modélisation
features = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'nb_pret', 'cumul_crediteur', 'cumul_debiteur', 'salaire', 'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement', 'mnt_virement', 'nb_versement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Ajouter une constante à la matrice de caractéristiques (interception)
X = sm.add_constant(df[features])
# Variable cible (target)
y = df['target']
# Créer le modèle de régression logistique
model = sm.Logit(y, X)
# Ajuster le modèle aux données
results = model.fit()
# Afficher les résultats de la régression logistique
print(results.summary())
Optimization terminated successfully.
Current function value: 0.493913
Iterations 5
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 1000
Model: Logit Df Residuals: 984
Method: MLE Df Model: 15
Date: Sun, 13 Aug 2023 Pseudo R-squ.: 0.01022
Time: 13:34:53 Log-Likelihood: -493.91
converged: True LL-Null: -499.01
Covariance Type: nonrobust LLR p-value: 0.8070
============================================================================================
coef std err z P>|z| [0.025 0.975]
--------------------------------------------------------------------------------------------
const -1.0247 0.572 -1.793 0.073 -2.145 0.096
age -0.0031 0.006 -0.562 0.574 -0.014 0.008
anciennete_bancaire_mois 0.0015 0.001 1.186 0.236 -0.001 0.004
solde_fin_mois 1.419e-06 5.15e-06 0.276 0.783 -8.68e-06 1.15e-05
nb_pret -0.0234 0.057 -0.409 0.683 -0.136 0.089
cumul_crediteur -1.878e-06 2.8e-06 -0.670 0.503 -7.37e-06 3.62e-06
cumul_debiteur -3.521e-07 2.78e-06 -0.126 0.899 -5.81e-06 5.1e-06
salaire 1.665e-05 3.1e-05 0.538 0.591 -4.4e-05 7.73e-05
mtn_paiement_par_carte -2.094e-05 5.67e-05 -0.369 0.712 -0.000 9.03e-05
nb_paiement_par_carte -0.0020 0.006 -0.362 0.717 -0.013 0.009
nb_virement -0.0117 0.014 -0.842 0.400 -0.039 0.016
mnt_virement 3.672e-06 1.41e-05 0.261 0.794 -2.39e-05 3.12e-05
nb_versement 0.0273 0.028 0.977 0.329 -0.027 0.082
mtn_versement 2.4e-07 2.79e-05 0.009 0.993 -5.44e-05 5.49e-05
mtn_paye -2.934e-06 2.75e-05 -0.107 0.915 -5.67e-05 5.09e-05
mtn_impaye -6.348e-05 2.79e-05 -2.274 0.023 -0.000 -8.78e-06
============================================================================================
df.columns
Index(['id', 'date_arrete', 'annee', 'mois', 'age', 'anciennete_bancaire_mois',
'situation_matrimoniale', 'solde_fin_mois', 'nb_pret',
'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement',
'mnt_virement', 'nb_versement', 'mtn_versement', 'mtn_paye',
'mtn_impaye', 'target'],
dtype='object')
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Charger le DataFrame depuis le code que vous avez fourni
# Assurez-vous que le DataFrame 'df' est déjà créé
# Caractéristiques à comparer
features_to_compare = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'nb_pret', 'cumul_crediteur', 'cumul_debiteur', 'salaire', 'mtn_paiement_par_carte']
# Comparaison de distributions
plt.figure(figsize=(15, 10))
for feature in features_to_compare:
plt.subplot(3, 3, features_to_compare.index(feature) + 1)
sns.boxplot(x='target', y=feature, data=df)
plt.title(f'{feature} par Target')
plt.ylabel(feature)
plt.tight_layout()
plt.show()
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
# Supposons que votre DataFrame s'appelle 'df'
# Supposons également que vous avez une colonne 'variable_numerique' à découper en classes
# Définir le nombre de bins (intervalles)
num_bins = 4
# Appliquer la découpe en classes avec le nombre de bins défini
df['solde_fin_mois1'] = pd.cut(df['solde_fin_mois'], bins=num_bins)
# Calculer le tableau de contingence entre les classes découpées et la variable cible 'target'
contingency_table = pd.crosstab(df['solde_fin_mois1'], df['target'])
# Effectuer le test du chi2 pour évaluer la corrélation entre les classes et la variable cible
chi2, p, dof, expected = chi2_contingency(contingency_table)
# Afficher les résultats
print("Tableau de contingence :\n", contingency_table)
print("\nRésultats du test du chi2 :")
print("Chi2:", chi2)
print("P-value:", p)
print("Degrés de liberté:", dof)
print("Expected frequencies:\n", expected)
Tableau de contingence : target 0 1 solde_fin_mois1 (-4943.74, 8800.578] 201 40 (8800.578, 22490.137] 192 54 (22490.137, 36179.696] 203 58 (36179.696, 49869.255] 205 47 Résultats du test du chi2 : Chi2: 3.4280302305840324 P-value: 0.33021701539615217 Degrés de liberté: 3 Expected frequencies: [[193.041 47.959] [197.046 48.954] [209.061 51.939] [201.852 50.148]]
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
# Supposons que votre DataFrame s'appelle 'df'
# Supposons également que vous avez une colonne 'variable_numerique' à découper en classes
# Définir les bornes des intervalles
intervals = [0, 1000, 2000, 3000, np.inf]
labels = ['<1000', '1000-2000', '2000-3000', '>3000']
# Appliquer la découpe en classes
df['solde_fin_mois1'] = pd.cut(df['solde_fin_mois'], bins=3)#intervals, labels=labels)
| id | date_arrete | annee | mois | age | anciennete_bancaire_mois | situation_matrimoniale | solde_fin_mois | nb_pret | cumul_crediteur | ... | nb_paiement_par_carte | nb_virement | mnt_virement | nb_versement | mtn_versement | mtn_paye | mtn_impaye | target | age_bin | solde_fin_mois1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2020-01-31 | 2022 | 7 | 56 | 52 | Célibataire | 3954.827732 | 1 | 76944.257942 | ... | 32 | 15 | 5235.057381 | 9 | 8444.056123 | 9535.722238 | 6268.536213 | 0 | Bin 4 | (-24.268, 16640.136] |
| 1 | 2 | 2020-02-29 | 2020 | 3 | 51 | 83 | Veuf | 5280.294233 | 4 | 93479.551749 | ... | 32 | 9 | 10251.818505 | 0 | 4532.997386 | 8396.244959 | 736.182615 | 0 | Bin 4 | (-24.268, 16640.136] |
| 3 | 4 | 2020-04-30 | 2022 | 8 | 22 | 80 | Divorcé | 16487.516104 | 4 | 81962.486955 | ... | 19 | 0 | 17210.229732 | 6 | 955.362076 | 6447.168378 | 3378.538857 | 0 | Bin 1 | (-24.268, 16640.136] |
| 4 | 5 | 2020-05-31 | 2020 | 5 | 47 | 108 | Divorcé | 5528.522427 | 2 | 88819.134966 | ... | 46 | 17 | 9475.203075 | 2 | 3960.243463 | 1770.709219 | 778.700643 | 0 | Bin 3 | (-24.268, 16640.136] |
| 5 | 6 | 2020-06-30 | 2020 | 4 | 29 | 142 | Marié | 17641.050325 | 1 | 19921.968584 | ... | 35 | 9 | 15991.572882 | 2 | 9832.414365 | 5605.221849 | 1916.992712 | 0 | Bin 1 | (16640.136, 33254.695] |
5 rows × 23 columns
# Calculer le taux de risque par classe
risk_rate_by_class = df.groupby('solde_fin_mois1')['target'].mean()
print(risk_rate_by_class)
solde_fin_mois1 (-24.268, 16640.136] 0.166090 (16640.136, 33254.695] 0.204545 (33254.695, 49869.255] 0.203822 Name: target, dtype: float64
# Calculer l'IV pour chaque classe
def calculate_iv(data, target_column):
grouped = data.groupby(target_column)
groups = data[target_column].unique()
iv_values = []
for group in groups:
obs_group = grouped.get_group(group)
obs_event = obs_group[obs_group['target'] == 1].shape[0]
obs_non_event = obs_group[obs_group['target'] == 0].shape[0]
total_event = data[data['target'] == 1].shape[0]
total_non_event = data[data['target'] == 0].shape[0]
iv = ((obs_event / total_event) - (obs_non_event / total_non_event)) * np.log((obs_event * total_non_event) / (obs_non_event * total_event))
iv_values.append(iv)
return sum(iv_values)
# Supprimer les lignes avec des valeurs manquantes dans les colonnes pertinentes
df = df.dropna(subset=['solde_fin_mois1', 'target'])
iv_value = calculate_iv(df, 'solde_fin_mois1')
print("Information Value (IV) :", iv_value)
Information Value (IV) : 0.0134649060159584
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Supposons que votre DataFrame s'appelle 'df'
# Supposons également que vous avez une liste de noms de colonnes numériques à analyser
numeric_columns = ['solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire', 'mtn_paiement_par_carte',
'mnt_virement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Définir le nombre de classes pour chaque variable numérique
num_classes_per_column = {
'solde_fin_mois': 2,
'cumul_crediteur': 2,
'cumul_debiteur': 2,
'salaire': 2,
'mtn_paiement_par_carte': 2,
'mnt_virement': 2,
'mtn_versement': 2,
'mtn_paye': 2,
'mtn_impaye': 2,
'situation_matrimoniale':2
}
# Calculer l'IV pour chaque classe
def calculate_iv(data, target_column):
grouped = data.groupby(target_column)
groups = data[target_column].unique()
iv_values = []
for group in groups:
obs_group = grouped.get_group(group)
obs_event = obs_group[obs_group['target'] == 1].shape[0]
obs_non_event = obs_group[obs_group['target'] == 0].shape[0]
total_event = data[data['target'] == 1].shape[0]
total_non_event = data[data['target'] == 0].shape[0]
iv = ((obs_event / total_event) - (obs_non_event / total_non_event)) * np.log((obs_event * total_non_event) / (obs_non_event * total_event))
iv_values.append(iv)
return sum(iv_values)
# Créer un graphique avec les taux de risque et les IV values pour chaque colonne
num_subplots = len(numeric_columns)
plt.figure(figsize=(20, 20))
for i, col in enumerate(numeric_columns, 1):
plt.subplot(3, 3, i)
# Appliquer la découpe en classes en utilisant le nombre de classes spécifique à la variable
num_classes = num_classes_per_column[col]
df[f'{col}_class'] = pd.cut(df[col], bins=num_classes)
# Calculer le taux de risque par classe
risk_rate_by_class = df.groupby(f'{col}_class')['target'].mean()
# Calculer l'IV value
iv_value = calculate_iv(df, f'{col}_class')
# Calculer la croissance/décroissance des taux de risque
rate_growth = np.diff(risk_rate_by_class.values)
#rate_change = "Croissance" if rate_growth.mean() > 0 else "Décroissance"
# Afficher les taux de risque sur le graphique
bars = plt.bar(risk_rate_by_class.index.astype(str), risk_rate_by_class.values,# alpha=0.7,
label=f'class effectif ({col})')
plt.axhline(y=iv_value, color='tab:red',linestyle='--', label=f'IV Value ({col})')
# Ajouter les valeurs de taux de risque au-dessus des barres
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval + 0.01, round(yval, 2), ha='center', va='bottom')
# Annoter avec la croissance/décroissance des taux
#plt.annotate(f'{rate_change}', xy=(0.5, 0.8), xycoords='axes fraction', ha='center', fontsize=12, color='blue')
# Ajouter l'IV Value sur le graphique
plt.annotate(f'IV Value = {iv_value:.2f}', xy=(0.5, 0.7), xycoords='axes fraction', ha='center', fontsize=12, color='red')
# Ajouter un trait reliant les taux de risque
for i in range(len(risk_rate_by_class) - 1):
plt.plot([i, i+1], [risk_rate_by_class.iloc[i], risk_rate_by_class.iloc[i+1]], color='orange', linestyle='--')
# Afficher l'effectif de chaque classe
class_counts = df[f'{col}_class'].value_counts()
for i, count in enumerate(class_counts):
plt.text(i, -0.02, f'N={count}', ha='center', va='center', color='black')
plt.title(f'Taux de Risque et IV Value ({col})')
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
plt.show()
import pandas as pd
# Let's assume your DataFrame is named 'df' and the column to be grouped is 'situation_matrimoniale'
# Create a dictionary to map old categories to new categories
category_mapping = {
'Célibataire': 'Célibataire',
'Marié': 'Marié',
'Divorcé': 'Célibataire', # Combine 'Divorcé' and 'Veuf' into a category named 'Autre'
'Veuf': 'Célibataire'
}
# Apply the mapping to create a new grouped column
df['situation_matrimoniale_grouped'] = df['situation_matrimoniale'].map(category_mapping)
# Print the updated DataFrame
print(df[['situation_matrimoniale', 'situation_matrimoniale_grouped']].head())
situation_matrimoniale situation_matrimoniale_grouped 0 Célibataire Célibataire 1 Veuf Célibataire 3 Divorcé Célibataire 4 Divorcé Célibataire 5 Marié Marié
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Supposons que votre DataFrame s'appelle 'df'
# Supposons également que vous avez une liste de noms de colonnes catégorielles à analyser
categorical_columns = ['situation_matrimoniale','situation_matrimoniale_grouped'] # Ajoutez d'autres colonnes si nécessaire
# Calculer l'IV pour chaque classe
def calculate_iv(data, target_column):
grouped = data.groupby(target_column)
groups = data[target_column].unique()
iv_values = []
for group in groups:
obs_group = grouped.get_group(group)
obs_event = obs_group[obs_group['target'] == 1].shape[0]
obs_non_event = obs_group[obs_group['target'] == 0].shape[0]
total_event = data[data['target'] == 1].shape[0]
total_non_event = data[data['target'] == 0].shape[0]
iv = ((obs_event / total_event) - (obs_non_event / total_non_event)) * np.log((obs_event * total_non_event) / (obs_non_event * total_event))
iv_values.append(iv)
return sum(iv_values)
# Créer un graphique avec les taux de risque et les IV values pour chaque colonne
num_subplots = len(categorical_columns)
plt.figure(figsize=(10, 6))
for i, col in enumerate(categorical_columns, 1):
plt.subplot(1, num_subplots, i)
# Calculer le taux de risque par classe
risk_rate_by_class = df.groupby(col)['target'].mean()
# Calculer l'IV value
iv_value = calculate_iv(df, col)
# Calculer la croissance/décroissance des taux de risque
rate_growth = np.diff(risk_rate_by_class.values)
rate_change = "Croissance" if rate_growth.mean() > 0 else "Décroissance"
# Afficher les taux de risque sur le graphique
bars = plt.bar(risk_rate_by_class.index, risk_rate_by_class.values, alpha=0.7, label=f'Taux de Risque ({col})')
plt.axhline(y=iv_value, linestyle='--', label=f'IV Value ({col})')
# Ajouter les valeurs de taux de risque au-dessus des barres
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval + 0.01, round(yval, 2), ha='center', va='bottom')
# Annoter avec la croissance/décroissance des taux
plt.annotate(f'{rate_change}', xy=(0.5, 0.8), xycoords='axes fraction', ha='center', fontsize=12, color='blue')
plt.title(f'Taux de Risque et IV Value ({col})')
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
plt.show()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Supposons que votre DataFrame s'appelle 'df'
# Supposons également que vous avez des colonnes numériques à analyser
numeric_columns = ['solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'mnt_virement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Sélectionner uniquement les colonnes numériques
numeric_df = df[numeric_columns]
# Calculer la matrice de corrélation
correlation_matrix = numeric_df.corr()
# Créer un graphique de la matrice de corrélation avec la bibliothèque Seaborn
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title("Matrice de Corrélation entre Variables Numériques")
plt.show()
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# Sélectionner les colonnes numériques pour l'ACP
numeric_columns = ['solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'mnt_virement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Sélectionner les colonnes cibles pour l'ACP
target_column = 'target'
# Extraire les données numériques et la colonne cible
data = df[numeric_columns]
target = df[target_column]
# Étape 1 : Standardisation des Données
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# Étape 2 : Calcul de la Matrice de Covariance
covariance_matrix = np.cov(data_scaled.T)
# Étape 3 : Calcul des Vecteurs Propres et Valeurs Propres
eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)
# Étape 4 : Sélection des Composantes Principales
explained_variance_ratio = eigenvalues / np.sum(eigenvalues)
cumulative_variance_ratio = np.cumsum(explained_variance_ratio)
# Choisir le nombre de composantes principales à conserver
num_components_to_keep = np.argmax(cumulative_variance_ratio >= 0.95) + 1
# Étape 5 : Projection des Données
pca = PCA(n_components=num_components_to_keep)
data_pca = pca.fit_transform(data_scaled)
# Étape 6 : Interprétation des Composantes Principales
principal_components = pca.components_
# Afficher les composantes principales
for i, component in enumerate(principal_components):
print(f"Composante Principale {i+1}: {component}")
# Étape 7 : Analyse de Variance Expliquée
print("Variance Expliquée par chaque Composante Principale:")
for i, explained_variance in enumerate(explained_variance_ratio):
print(f"Composante Principale {i+1}: {explained_variance:.4f}")
Composante Principale 1: [-0.06578582 0.50343502 -0.21918231 -0.28525512 -0.2346848 -0.40617953 -0.46874001 0.33329188 -0.24890681] Composante Principale 2: [ 0.59686256 -0.23912884 -0.55294708 -0.03368308 -0.23675364 0.00831511 -0.20745164 -0.41813441 -0.07545515] Composante Principale 3: [-0.27865391 -0.25697855 -0.20732869 -0.52608508 0.51125293 -0.10206906 -0.29994528 -0.14753226 0.39119398] Composante Principale 4: [ 0.07649892 0.24528872 0.08471179 0.45909374 -0.09485193 -0.39505679 -0.17275152 -0.17491788 0.70037998] Composante Principale 5: [ 0.17444239 0.39661597 -0.148648 0.30792113 0.50006804 0.55260184 -0.35842104 0.10409805 -0.02480103] Composante Principale 6: [-0.08873067 0.09003381 0.50211313 -0.26430933 -0.40112288 0.40787062 -0.42623385 -0.38587043 0.06491901] Composante Principale 7: [-0.43883261 0.06945151 -0.05111186 0.32482006 0.18987345 -0.24796786 -0.09664311 -0.60402351 -0.4719721 ] Composante Principale 8: [-0.55472348 -0.23647743 -0.46285914 0.27594798 -0.40327595 0.31265147 -0.13441048 0.20590496 0.15852117] Composante Principale 9: [-0.13165013 0.58052618 -0.3240101 -0.28919231 -0.09403873 0.19363587 0.52904571 -0.30780591 0.18992337] Variance Expliquée par chaque Composante Principale: Composante Principale 1: 0.1300 Composante Principale 2: 0.1242 Composante Principale 3: 0.0965 Composante Principale 4: 0.0988 Composante Principale 5: 0.1169 Composante Principale 6: 0.1055 Composante Principale 7: 0.1110 Composante Principale 8: 0.1096 Composante Principale 9: 0.1074
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# Sélectionner les colonnes numériques pour l'ACP
numeric_columns = ['solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'mnt_virement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Sélectionner la colonne cible pour l'ACP
target_column = 'target'
# Extraire les données numériques et la colonne cible
data = df[numeric_columns]
target = df[target_column]
# Étape 1 : Standardisation des Données
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# Étape 5 : Projection des Données
pca = PCA()
data_pca = pca.fit_transform(data_scaled)
print(data_pca)
# Visualisation des Composantes Principales
plt.figure(figsize=(10, 6))
plt.plot(np.cumsum(pca.explained_variance_ratio_), marker='o')
plt.xlabel('Nombre de Composantes Principales')
plt.ylabel('Variance Expliquée Cumulative')
plt.title('Variance Expliquée Cumulative par Composantes Principales')
plt.show()
# Création d'un dataframe pour les composantes principales
pca_df = pd.DataFrame(data_pca, columns=[f'PC{i+1}' for i in range(data_pca.shape[1])])
pca_df['target'] = target
print(pca_df)
# Création d'une paire de graphiques pour visualiser les composantes principales
sns.pairplot(pca_df, hue='target', diag_kind='kde')
plt.show()
[[ 1.33306846 -1.05662436 -0.29135301 ... -0.43984527 1.59858329 1.38430443] [ 2.35937472 -0.71385804 0.32287126 ... 0.42113542 0.75869942 1.18042776] [ 0.1890046 -1.1237671 -0.16766723 ... 0.9363313 0.28689246 -0.73648876] ... [ 0.59878571 0.38967613 0.40152883 ... 0.61246795 0.19250686 3.1068621 ] [-0.01211865 0.78466832 1.78007067 ... 0.7830549 0.10441565 2.21541197] [-0.18035226 -0.76809469 -0.25462636 ... 2.12933035 -0.10021149 -0.30809673]]
PC1 PC2 PC3 PC4 PC5 PC6 PC7 \
0 1.333068 -1.056624 -0.291353 0.220682 -0.912359 -1.611022 -0.439845
1 2.359375 -0.713858 0.322871 -1.680719 0.451782 -0.718412 0.421135
2 0.189005 -1.123767 -0.167667 0.074285 2.803590 0.085936 0.936331
3 -0.053469 -1.761876 -0.482380 0.071247 1.176864 0.466544 2.759959
4 -1.624215 -0.539831 -0.906746 -1.454723 -0.132390 -0.841525 0.431726
.. ... ... ... ... ... ... ...
906 0.920307 0.919119 0.497374 -0.607438 -1.334496 0.644595 -0.428810
907 -0.714750 0.184304 0.242344 0.439617 -1.635994 0.669369 -1.570084
908 0.598786 0.389676 0.401529 -0.901695 -0.029253 0.196125 0.612468
909 -0.012119 0.784668 1.780071 -0.844213 1.557422 0.483133 0.783055
910 -0.180352 -0.768095 -0.254626 -0.987139 -1.795238 0.624536 2.129330
PC8 PC9 target
0 1.598583 1.384304 0.0
1 0.758699 1.180428 0.0
2 0.286892 -0.736489 NaN
3 -0.954900 -0.190221 0.0
4 0.585190 0.030449 0.0
.. ... ... ...
906 0.252996 0.539354 0.0
907 -0.379508 -0.306976 0.0
908 0.192507 3.106862 1.0
909 0.104416 2.215412 0.0
910 -0.100211 -0.308097 0.0
[911 rows x 10 columns]
import pandas as pd
from sklearn.preprocessing import StandardScaler
# Suppose your DataFrame is named 'df'
# Suppose you have columns you want to standardize, e.g., 'solde_fin_mois', 'cumul_crediteur', etc.
# Select the columns to standardize
columns_to_standardize = ['solde_fin_mois', 'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'mnt_virement', 'mtn_versement', 'mtn_paye', 'mtn_impaye']
# Create a DataFrame with the selected columns
data_to_standardize = df[columns_to_standardize]
# Initialize the StandardScaler
scaler = StandardScaler()
# Fit and transform the data
data_standardized = scaler.fit_transform(data_to_standardize)
# Create a new DataFrame with standardized data
df_standardized = pd.DataFrame(data_standardized, columns=columns_to_standardize)
# Display the first few rows of the standardized DataFrame
print(df_standardized.head())
solde_fin_mois cumul_crediteur cumul_debiteur salaire \ 0 -1.512492 0.940931 -1.468088 -0.047285 1 -1.418356 1.512869 -1.514772 -1.256664 2 -0.622405 1.114506 0.305395 1.543113 3 -1.400726 1.351670 1.513861 1.288147 4 -0.540479 -1.031409 0.013605 0.765237 mtn_paiement_par_carte mnt_virement mtn_versement mtn_paye mtn_impaye 0 -0.900966 -0.892037 1.217285 1.585901 0.430461 1 0.116872 -0.015251 -0.138233 1.193948 -1.496384 2 1.627794 1.200880 -1.378191 0.523512 -0.576086 3 1.504693 -0.150981 -0.336741 -1.085079 -1.481575 4 0.297860 0.987893 1.698471 0.233902 -1.085123
Les croisements de variables, également appelés tableaux de contingence ou crosstabs, sont utilisés pour analyser la relation entre deux variables catégorielles.
df.columns
Index(['id', 'date_arrete', 'annee', 'mois', 'age', 'anciennete_bancaire_mois',
'situation_matrimoniale', 'solde_fin_mois', 'nb_pret',
'cumul_crediteur', 'cumul_debiteur', 'salaire',
'mtn_paiement_par_carte', 'nb_paiement_par_carte', 'nb_virement',
'mnt_virement', 'nb_versement', 'mtn_versement', 'mtn_paye',
'mtn_impaye', 'target', 'age_bin', 'solde_fin_mois1',
'solde_fin_mois_class', 'cumul_crediteur_class', 'cumul_debiteur_class',
'salaire_class', 'mtn_paiement_par_carte_class', 'mnt_virement_class',
'mtn_versement_class', 'mtn_paye_class', 'mtn_impaye_class',
'situation_matrimoniale_grouped'],
dtype='object')
import pandas as pd
from scipy.stats import chi2_contingency
# Créer un croisement de variables
croisement = pd.crosstab(df['situation_matrimoniale'], df['situation_matrimoniale_grouped'])
# Afficher le croisement de variables
print("Croisement de Variables :")
print(croisement)
# Effectuer un test du chi-carré
chi2, p_value, dof, expected = chi2_contingency(croisement)
print("\nTest du Chi-Carré :")
print("Chi-Carré :", chi2)
print("Valeur P :", p_value)
Croisement de Variables : situation_matrimoniale_grouped Célibataire Marié situation_matrimoniale Célibataire 234 0 Divorcé 230 0 Marié 0 222 Veuf 225 0 Test du Chi-Carré : Chi-Carré : 911.0000000000001 Valeur P : 3.6394745213287835e-197
import pandas as pd
from scipy.stats import chi2_contingency
# Supposons que votre DataFrame s'appelle 'df'
# Supposons que vous avez une liste de noms de colonnes catégorielles 'colonnes_categorielles'
# Liste des noms de colonnes catégorielles
colonnes_categorielles = ['variable1', 'variable2', 'variable3']
# Parcourir les colonnes catégorielles
for colonne in colonnes_categorielles:
croisement = pd.crosstab(df[colonne], df['target'])
print("Croisement de Variables pour :", colonne)
print(croisement)
chi2, p_value, dof, expected = chi2_contingency(croisement)
print("\nTest du Chi-Carré pour :", colonne)
print("Chi-Carré :", chi2)
print("Valeur P :", p_value)
print("-" * 50)
import pandas as pd
from scipy.stats import chi2_contingency
# Supposons que votre DataFrame s'appelle 'df'
# Supposons que vous avez la colonne 'situation_matrimoniale' à analyser
# Créer un croisement de la colonne 'situation_matrimoniale' avec la colonne 'target'
croisement = pd.crosstab(df['situation_matrimoniale'], df['target'])
# Afficher le croisement de variables
print("Croisement de Variables pour la situation matrimoniale :")
print(croisement)
# Effectuer un test du chi-carré
chi2, p_value, dof, expected = chi2_contingency(croisement)
print("\nTest du Chi-Carré pour la situation matrimoniale :")
print("Chi-Carré :", chi2)
print("Valeur P :", p_value)
Croisement de Variables pour la situation matrimoniale : target 0 1 situation_matrimoniale Célibataire 197 37 Divorcé 188 42 Marié 173 49 Veuf 178 47 Test du Chi-Carré pour la situation matrimoniale : Chi-Carré : 3.4548758135833735 Valeur P : 0.3266619066468993
import pandas as pd
import numpy as np
from scipy.stats import ttest_ind
# Supposons que votre DataFrame s'appelle 'df'
# Supposons que vous avez plusieurs variables numériques à analyser
# Liste des noms de colonnes numériques
colonnes_numeriques = ['age', 'anciennete_bancaire_mois', 'solde_fin_mois', 'salaire']
# Parcourir les colonnes numériques
for colonne in colonnes_numeriques:
# Calcul de la moyenne et de l'écart-type pour chaque groupe (target 0 et target 1)
moyenne_target_0 = df[df['target'] == 0][colonne].mean()
moyenne_target_1 = df[df['target'] == 1][colonne].mean()
ecart_type_target_0 = df[df['target'] == 0][colonne].std()
ecart_type_target_1 = df[df['target'] == 1][colonne].std()
# Test de Student (t-test) pour comparer les moyennes entre les groupes
t_stat, p_value = ttest_ind(df[df['target'] == 0][colonne], df[df['target'] == 1][colonne])
print("Analyse de la variable numérique :", colonne)
print("-" * 50)
print("Moyenne pour target 0 :", moyenne_target_0)
print("Moyenne pour target 1 :", moyenne_target_1)
print("Écart-type pour target 0 :", ecart_type_target_0)
print("Écart-type pour target 1 :", ecart_type_target_1)
print("Résultat du t-test - Statistique de test :", t_stat)
print("Résultat du t-test - Valeur P :", p_value)
print("=" * 50)
Analyse de la variable numérique : age -------------------------------------------------- Moyenne pour target 0 : 44.25135869565217 Moyenne pour target 1 : 43.497142857142855 Écart-type pour target 0 : 14.356325427632497 Écart-type pour target 1 : 14.699626348255423 Résultat du t-test - Statistique de test : 0.6217970517971219 Résultat du t-test - Valeur P : 0.5342312396813739 ================================================== Analyse de la variable numérique : anciennete_bancaire_mois -------------------------------------------------- Moyenne pour target 0 : 122.93342391304348 Moyenne pour target 1 : 123.86285714285714 Écart-type pour target 0 : 63.8708064403112 Écart-type pour target 1 : 68.04835622477054 Résultat du t-test - Statistique de test : -0.17083258919184402 Résultat du t-test - Valeur P : 0.8643934205892599 ================================================== Analyse de la variable numérique : solde_fin_mois -------------------------------------------------- Moyenne pour target 0 : 24918.222126554378 Moyenne pour target 1 : 26651.35186870924 Écart-type pour target 0 : 14231.347625940396 Écart-type pour target 1 : 13417.413172848333 Résultat du t-test - Statistique de test : -1.4637005707911621 Résultat du t-test - Valeur P : 0.14362148675520936 ================================================== Analyse de la variable numérique : salaire -------------------------------------------------- Moyenne pour target 0 : 5402.234947417324 Moyenne pour target 1 : 5474.749324577538 Écart-type pour target 0 : 2569.7090150889067 Écart-type pour target 1 : 2620.5839757117237 Résultat du t-test - Statistique de test : -0.3342589961311109 Résultat du t-test - Valeur P : 0.7382612320152528 ==================================================
B
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Input In [541], in <cell line: 1>() ----> 1 B NameError: name 'B' is not defined
https://www.aqsone.com/en/blog/articlescientifique/interpretabilite-et-explicabilite-des-modeles-de-machine-learning/
https://christophm.github.io/interpretable-ml-book/logistic.html